WooCommerce有条件的自定义字段如果车产品类别

问题描述:

OK,我很为难。我已经搜索并阅读了几篇文章,其中包括相关帖子Checking products in cart based on category name woocommerce?,其中我从中得到了大部分代码,而Woocommerce - Add filter to display (or hide) custom checkout field if product ID == #对于产品ID而非类别ID是特定的。WooCommerce有条件的自定义字段如果车产品类别

我想显示如果sdc_custom_checkout_field,且仅当目标类别ID(237在这种情况下)在购物车中。

我尝试注释掉sdc_custom_checkout_field功能和使用如下一个简单的测试,但一直得到“不!”,所以我想查询不正确。

add_action('woocommerce_before_order_notes', 'sdc_custom_checkout_field'); 

function sdc_custom_checkout_field($checkout) { 

//Check if Product in Cart 
//$product_in_cart = check_product_in_cart(); 

//Product is in cart so show additional fields 
if ($product_in_cart === true) { 
echo '<div id="my_custom_checkout_field"><h3>' . __('Duplicate Card Information' . '</h3><br>'); 

woocommerce_form_field('dupecard_location', array(
'type' => 'text', 
'class' => array('dupecard-location form-row-wide'), 
'label' => __('Course Location'), 
), $checkout->get_value('dupecard_location')); 

woocommerce_form_field('dupecard_instructor', array(
'type' => 'text', 
'class' => array('dupecard-instructor form-row-wide'), 
'label' => __('Instructor Name'), 
), $checkout->get_value('dupecard_instructor')); 

woocommerce_form_field('dupecard_requestor_name', array(
'type' => 'text', 
'class' => array('dupecard-requestor-name form-row-wide'), 
'label' => __('Requestor Name'), 
), $checkout->get_value('dupecard_requestor_name')); 

woocommerce_form_field('dupecard_requestor_email', array(
'type' => 'text', 
'class' => array('dupecard-requestor-email form-row-wide'), 
'label' => __('Requestor Email'), 
), $checkout->get_value('dupecard_requestor_email')); 

    woocommerce_form_field('dupecard_requestor_phone', array(
'type' => 'text', 
'class' => array('dupecard-requestor-phone form-row-wide'), 
'label' => __('Requestor Phone'), 
), $checkout->get_value('dupecard_requestor_phone')); 

echo '</div>'; 
} 
} 

function check_product_in_cart() { 
//Check to see if user has product in cart 
global $woocommerce; 

//assign default negative value 
$product_in_cart = false; 

// start cart items fetch loop 

foreach ($woocommerce->cart->get_cart() as $cart_item_key => $values) { 
    $_product = $values['data']; 
    $terms = get_the_terms($_product->id, 'product_cat'); 

    // second level loop search, in case some items have several categories 

    $cat_ids = array(); 

    foreach ($terms as $term) { 
     $cat_ids[] = $term->term_id; 
    } 

    if(in_array(237, (array)$cat_ids)) { 

     //category is in cart! 
     $product_in_cart = true; 
    } 
} 

return $product_in_cart; 
} 

这里的测试片段:

if ($item_in_cart === true) {echo 'YES';} 
else {echo 'Nope!';} 

我也取代

$ item_in_cart

$ product_in_cart

但它没有区别。

**********编辑响应@PRAFULLA **********

@Prafulla - 感谢您的输入。我很感激。我修改了我的代码片段,并入了您的代码,但无法使其工作。我是一个PHP新手,所以,毫不奇怪。你有额外的建议吗?

add_action('woocommerce_before_order_notes', 'sdc_custom_checkout_field'); 

function sdc_custom_checkout_field($checkout) { 

//Check if Product in Cart 
$your_product_category = is_category_in_cart(); 

//Product is in cart so show additional fields 
if ($your_product_category === true) { 
echo '<div id="my_custom_checkout_field"><h3>' . __('Duplicate Card Information' . '</h3><br>'); 

woocommerce_form_field('dupecard_location', array(
'type' => 'text', 
'class' => array('dupecard-location form-row-wide'), 
'label' => __('Course Location'), 
), $checkout->get_value('dupecard_location')); 

woocommerce_form_field('dupecard_instructor', array(
'type' => 'text', 
'class' => array('dupecard-instructor form-row-wide'), 
'label' => __('Instructor Name'), 
), $checkout->get_value('dupecard_instructor')); 

woocommerce_form_field('dupecard_requestor_name', array(
'type' => 'text', 
'class' => array('dupecard-requestor-name form-row-wide'), 
'label' => __('Requestor Name'), 
), $checkout->get_value('dupecard_requestor_name')); 

woocommerce_form_field('dupecard_requestor_email', array(
'type' => 'text', 
'class' => array('dupecard-requestor-email form-row-wide'), 
'label' => __('Requestor Email'), 
), $checkout->get_value('dupecard_requestor_email')); 

    woocommerce_form_field('dupecard_requestor_phone', array(
'type' => 'text', 
'class' => array('dupecard-requestor-phone form-row-wide'), 
'label' => __('Requestor Phone'), 
), $checkout->get_value('dupecard_requestor_phone')); 

echo '</div>'; 
} 
} 

function is_category_in_cart($your_product_category = 237){ 
global $woocommerce; 
$products_in_cart = $woocommerce->cart->get_cart(); 
$product_types_in_cart = array_column($products_in_cart, 'data'); 
//if ( $product_types_in_cart[0]->product_type == 'subscription') { this is what I have tested 
if ( $product_types_in_cart[0]->product_cat == $your_product_category) { 
    return true; 
} 
return $your_product_category; 
} 

经过大量的工作,研究,以及对其他网站的一些支付帮助援助,这是工作的结果:

// Add the field to the checkout 

add_action('woocommerce_before_order_notes', 'sdc_custom_checkout_field'); 

function sdc_custom_checkout_field($checkout) { 
    if(check_product_category()){ 
     echo '<div id="sdc_checkout_field"><h3>' . __('Duplicate Card Information' . '</h3><br>'); 

     woocommerce_form_field('dupecard_location', array(
      'type' => 'text', 
      'required' => true, 
      'class' => array('dupecard-location form-row-wide'), 
      'label' => __('Course Location'), 
     ), $checkout->get_value('dupecard_location')); 

     woocommerce_form_field('dupecard_instructor', array(
      'type' => 'text', 
      'required' => true, 
      'class' => array('dupecard-instructor form-row-wide'), 
      'label' => __('Instructor Name'), 
     ), $checkout->get_value('dupecard_instructor')); 

     woocommerce_form_field('dupecard_requestor_name', array(
      'type' => 'text', 
      'required' => true, 
      'class' => array('dupecard-requestor-name form-row-wide'), 
      'label' => __('Requestor Name'), 
     ), $checkout->get_value('dupecard_requestor_name')); 

     woocommerce_form_field('dupecard_requestor_email', array(
      'type' => 'text', 
      'required' => true, 
      'class' => array('dupecard-requestor-email form-row-wide'), 
      'label' => __('Requestor Email'), 
     ), $checkout->get_value('dupecard_requestor_email')); 

     woocommerce_form_field('dupecard_requestor_phone', array(
      'type' => 'text', 
      'required' => true, 
      'class' => array('dupecard-requestor-phone form-row-wide'), 
      'label' => __('Requestor Phone'), 
     ), $checkout->get_value('dupecard_requestor_phone')); 
     echo '</div>'; 
    } 
} 

function check_product_category(){ 
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) { 
     $product_id = apply_filters('woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key); 
     if(is_category_in_cart($product_id)){ 
      return true;  
     } 
    } 
    return false; 
} 

function is_category_in_cart($product_id){ 
    return has_term(237,'product_cat', get_post($product_id)); 
} 

/*Save to DB as post meta*/ 
add_action('woocommerce_checkout_update_order_meta',     'my_custom_checkout_field_update_order_meta'); 

function my_custom_checkout_field_update_order_meta($order_id) { 
    if (! empty($_POST['dupecard_location'])) { 
    update_post_meta($order_id, 'dupecard_location', sanitize_text_field($_POST['dupecard_location'])); 
    } 
    if (! empty($_POST['dupecard_instructor'])) { 
    update_post_meta($order_id, 'dupecard_instructor', sanitize_text_field($_POST['dupecard_instructor'])); 
    } 
    if (! empty($_POST['dupecard_requestor_name'])) { 
    update_post_meta($order_id, 'dupecard_requestor_name', sanitize_text_field($_POST['dupecard_requestor_name'])); 
    } 
    if (! empty($_POST['dupecard_requestor_email'])) { 
    update_post_meta($order_id, 'dupecard_requestor_email', sanitize_text_field($_POST['dupecard_requestor_email'])); 
    } 
    if (! empty($_POST['dupecard_requestor_phone'])) { 
    update_post_meta($order_id, 'dupecard_requestor_phone', sanitize_text_field($_POST['dupecard_requestor_phone'])); 
    } 
} 
+0

非常感谢你的男人,你是一个拯救生命的人:) – Anil

这是我如何得到我的情况下完成任务,请尝试一下,记下你需要给这个代码的输入,因为它不是直接使用写的。

function is_category_in_cart($your_product_category = null){ 
    global $woocommerce; 
    $products_in_cart = $woocommerce->cart->get_cart(); 
    $product_types_in_cart = array_column($products_in_cart, 'data'); 
    //if ( $product_types_in_cart[0]->product_type == 'subscription') { this is what I have tested 
    if ( $product_types_in_cart[0]->product_cat == $your_product_category) { 
     return true; 
    } 
} 
+0

比Prafulla。不知道你是否收到我的编辑通知,所以我在这里发布。 – KillerDesigner

+0

你能否请'var_dump($ product_types_in_cart [0])'在你的情况下? –

+0

假设我将该行追加到我的functions.php文件的末尾,它输出/返回NULL。 – KillerDesigner