Хорошо, я в тупике. Я искал и читал несколько сообщений, включая связанный пост 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;
}
Огромное спасибо, вы спасатель жизни :) – Anil