Отображать пользовательское сообщение, когда в корзине находятся 2 определенные категории товаров
В Woocommerce я пытаюсь создать функцию, которая отображает сообщение над страницей корзины , когда товары обеих категорий находятся в корзине.
Я пытаюсь изменить код, который я нашел здесь, но теперь он уже показывает сообщение, когда добавляется одна из категорий вместо обеих:
add_action( 'woocommerce_before_cart', 'allclean_add_checkout_content', 12 );
function allclean_add_checkout_content() {
$special_cat2 = 'test-cat2';
$special_cat3 = 'test-cat3';
$bool = false;
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$item = $cart_item['data'];
if ( has_term( $special_cat2 && $special_cat3, 'product_cat', $item->id ) )
$bool = true;
}
if ($bool)
echo '<div class="cartmessage">Warning! Beware of combining these materials!</div>';
}
2 answers
В вашем коде есть некоторые ошибки, например has_term()
не поддерживает 2 термина, разделенных &&
, и для получения идентификатора продукта из корзины для пользовательской таксономии в качестве категорий продуктов вам нужен $cart_item['product_id']
вместо этого, который также будет работать с вариантами продуктов......
Чтобы это работало, когда обе категории товаров находятся в корзине, используйте вместо этого следующее:
add_action( 'woocommerce_before_cart', 'allclean_add_checkout_content', 12 );
function allclean_add_checkout_content() {
$product_cats = array('test-cat2','test-cat3');
$found1 = $found2 = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
// The needed working product ID is $cart_item['product_id'] <====
if ( has_term( $product_cats[0], 'product_cat', $cart_item['product_id'] ) )
$found1 = true;
elseif ( has_term( $product_cats[1], 'product_cat', $cart_item['product_id'] ) )
$found2 = true;
}
if ( $found1 && $found2 )
echo '<div class="cartmessage">Warning! Beware of combining these materials!</div>';
}
Вводится код function.php файл вашей активной дочерней темы (или активной темы). Протестировано и работает.
Команда $special_cat2 && $special_cat3
представляет собой AND
вычисление двух переменных. Использование оператора &&
заставит PHP преобразовать обе переменные в логические. Поэтому результат этой команды также является логическим и true
в вашем случае. Таким образом, ваш звонок эквивалентен:
has_term(TRUE, 'product_cat', $item->id)
Это явно не то, чего вы хотите.
Вместо этого вы хотите вызвать has_term()
дважды для каждой категории:
if (has_term($special_cat2, 'product_cat', $item->id) && has_term($special_cat3, 'product_cat', $item->id)) {
... // Now both terms are present
}
Оператор &&
отличается от простого И (&
), потому что он включает вялость. Это означает, что если первый вызов has_term()
уже возвращает false
, второй вызов не будет выполнен. Это идеально подходит для сокращения времени загрузки.