当购物车中有 2 个特定产品类别时显示自定义消息
Display a custom message When 2 specific product category are in cart
在 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>';
}
命令$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()
returns false
的第一个调用已经完成,则第二个调用将不会完成。这非常适合减少加载时间。
您的代码中存在一些错误,例如 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 文件。 已测试并有效。
在 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>';
}
命令$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()
returns false
的第一个调用已经完成,则第二个调用将不会完成。这非常适合减少加载时间。
您的代码中存在一些错误,例如 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 文件。 已测试并有效。