Я пытаюсь написать 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, все работает нормально, но применимо ко всем продуктам, а это нехорошо. Итак, как я могу заставить его работать?

0
Kipras Bielinskas 5 Окт 2018 в 00:05

1 ответ

Лучший ответ

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

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;
    }
  }

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

add_action( 'woocommerce_before_checkout_form', 'find_product_in_cart' );
2
Kipras Bielinskas 5 Окт 2018 в 15:33