显示自定义消息当购物车中有2个特定产品类别时

时间:2018-03-29 12:27:49

标签: php wordpress woocommerce cart custom-taxonomy

在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 个答案:

答案 0 :(得分:2)

命令$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
}

操作符&&与简单的AND(&)不同,因为它包含惰性。这意味着,如果has_term()的第一次调用已经返回false,则第二次调用将不会完成。这非常适合减少加载时间。

答案 1 :(得分:2)

您的代码中存在一些错误,例如has_term()不支持使用&&分隔的2个字词,并且可以从购物车中获取产品ID作为您需要的产品类别$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文件中。 经过测试并正常工作