Отображать пользовательское сообщение, когда в корзине находятся 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>';
}
Author: LoicTheAztec, 2018-03-29

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 файл вашей активной дочерней темы (или активной темы). Протестировано и работает.

 2
Author: LoicTheAztec, 2018-03-29 13:56:16

Команда $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, второй вызов не будет выполнен. Это идеально подходит для сокращения времени загрузки.

 2
Author: Philipp Maurer, 2018-03-29 12:39:41