woocommerce, если конкретный продукт находится в корзине, отключите определенные поля оформления заказа, которые в противном случае потребовались бы - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь написать php-код для woocommerce, который бы проверял, есть ли конкретный товар в корзине, и если это правда, то некоторые поля оформления заказа будут отключены.Что у меня сейчас:

add_action( 'woocommerce_before_checkout_form', 'find_product_in_cart' );

function find_product_in_cart() {
$product_id = 989; //product id which would trigger
$in_cart = false;

foreach( WC()->cart->get_cart() as $cart_item ) {
   $product_in_cart = $cart_item['product_id'];
   if ( $product_in_cart === $product_id ) $in_cart = true; // checks if the product is in cart
}
    if ( $in_cart ) {
      add_filter( 'woocommerce_billing_fields', 'woo_filter_state_billing');
      function woo_filter_state_billing( $address_fields ) {
        //sets fields to not required
          $address_fields['billing_state']['required'] = false;
          $address_fields['billing_country']['required'] = false;
          $address_fields['billing_address_1']['required'] = false;
          $address_fields['billing_city']['required'] = false;
          $address_fields['billing_postcode']['required'] = false;
          $address_fields['billing_phone']['required'] = false;
          return $address_fields;
      }

      add_filter( 'woocommerce_checkout_fields' , 'disabling' );
      function disabling($fields){
        //hides fields
        unset($fields['billing']['billing_company']);
        unset($fields['billing']['billing_address_1']);
          unset($fields['billing']['billing_city']);
        unset($fields['billing']['billing_postcode']);
        unset($fields['billing']['billing_phone']);
        unset($fields['billing']['billing_country']);
        unset($fields['billing']['billing_state']);
        return $fields;
      }
    }
}

Так что проблема в том, что по какой-то причине поля остаются обязательными, даже если они скрыты.Если я вырежу целое:

add_filter( 'woocommerce_billing_fields', 'woo_filter_state_billing');
      function woo_filter_state_billing( $address_fields ) {
        //sets fields to not required
          $address_fields['billing_state']['required'] = false;
          $address_fields['billing_country']['required'] = false;
          $address_fields['billing_address_1']['required'] = false;
          $address_fields['billing_city']['required'] = false;
          $address_fields['billing_postcode']['required'] = false;
          $address_fields['billing_phone']['required'] = false;
          return $address_fields;
      }

и вставлю его точно так же, как в functions.php, все работает просто отлично, но это относится ко всем продуктам, и это не хорошо.Итак, как я могу заставить это работать?

1 Ответ

0 голосов
/ 05 октября 2018

Так что мне удалось все переделать более чистым способом, и это работает!

add_filter( 'woocommerce_checkout_fields' , 'disabling' );
  function disabling($fields){
    $product_id = 989; //product id which would trigger
    $in_cart = false;
    foreach( WC()->cart->get_cart() as $cart_item ) {
       $product_in_cart = $cart_item['product_id'];
       if ( $product_in_cart === $product_id ) $in_cart = true; // checks if the product is in cart
    }
    if ( $in_cart ){
      unset($fields['billing']['billing_company']);
      unset($fields['billing']['billing_address_1']);
      unset($fields['billing']['billing_city']);
      unset($fields['billing']['billing_postcode']);
      unset($fields['billing']['billing_phone']);
      unset($fields['billing']['billing_country']);
      unset($fields['billing']['billing_state']);
      return $fields;
    }
    else {
      return $fields;
    }
  }

Итак, в конце я думаю, что неустановленная функция не сработала должным образом из-за верхней add_action:

add_action( 'woocommerce_before_checkout_form', 'find_product_in_cart' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...