2015-10-20 3 views
2

Хорошо, я в тупике. Я искал и читал несколько сообщений, включая связанный пост Checking products in cart based on category name woocommerce?, откуда я получил большую часть этого кода, и Woocommerce - Add filter to display (or hide) custom checkout field if product ID == #, который относится только к идентификаторам продуктов, а не к идентификаторам категорий.Условные пользовательские поля WooCommerce, если категория продукта в корзине

Я хочу отобразить sdc_custom_checkout_field, если и только если идентификатор целевой категории (237 в этом случае) находится в корзине.

Я пробовал комментировать функцию sdc_custom_checkout_field и с помощью простого теста, показанного ниже, но продолжал получать «Nope!», Поэтому я предполагаю, что запрос неверен.

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

но без изменений.

********** EDIT РЕАКЦИЯ @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; 
} 

ответ

5

После долгих работ, исследований и помощи какой-либо платной помощи на другом веб-сайте, это рабочий результат:

// 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

0

Это, как я получить работу в моем случае, пожалуйста, попробуйте и отметьте, где вы должны дать свой вклад в этот код, как это написано не для непосредственного использования.

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

 Смежные вопросы

  • Нет связанных вопросов^_^