我遇到了一些问题,我的条件,以检查车总,其中车数量和航运类。
我想达到的目标
我试图隐藏一个特定的航运方法free_shipping:7
的基础上,其他特定的航运类和购物车总数的数量。
我遇到的问题是我的条件逻辑在使用||
(或)运算符后无法工作,如果我还检查数量,它将不会检查购物车总数。
密码
/* Hide free shipping unless minimum of 6 bottle or 1 box is selected, or if 2 gins and under 600 cart total */
add_filter( 'woocommerce_package_rates', 'hide_free_shipping_method', 10, 2 );
function hide_free_shipping_method( $rates, $package )
{
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Shipping class to check for
$class1 = 132; // shipping class for bottles
$class2 = 131; // shipping class for boxes
$class3 = 142; // shipping class for gin bottles
// Shipping method to hide
$ShipMethod_key_ids = array('free_shipping:7'); // free shipping
// Get cart total of items in the cart, but after discounts.
$cart_totals = WC()->cart->cart_contents_total;
// Keep track of the quantity of items with the specified shipping class
$quantity_bottle = 0;
$quantity_gin = 0;
$quantity_box = 0;
// Loop through cart content and add to specified shipping classes
if( $item['data']->get_shipping_class_id() == $class1 || $item['data']->get_shipping_class_id() == $class3){
$quantity_bottle += $item['quantity'];
$quantity_gin += $item['quantity'];
}
elseif ( $item['data']->get_shipping_class_id() == $class2 ) {
$quantity_box += $item['quantity'];
}
}
// If there are less than 6 bottles, 6 gins, and less than 1 box
// or
// if equal to 2 gins and less than 600 in Cart Total, hide the shipping method
if( $quantity_bottle < 6 && $quantity_gin < 6 && $quantity_box < 1 || $quantity_gin == 2 && $cart_totals < 600 ) {
foreach( $ShipMethod_key_ids as $method_key_id ){
unset($rates[$method_key_id]);
}
}
return $rates;
}
问题
我遇到的问题是,检查购物车总数的条件在与||
(或)运算符结合使用时不起作用。
if( $quantity_bottle < 6 && $quantity_gin < 6 && $quantity_box < 1 || $quantity_gin == 2 && $cart_totals < 600 ) {
如果我使用组合的例子,如上所述,代码将忽略最后一个条件(2)。
该条件只适用于以下两种情况之一:
$quantity_bottle < 6 && $quantity_gin < 6 && $quantity_box < 1
$quantity_gin == 2 && $cart_totals < 600
我所尝试的
我试着把这两种情况分开,看看它们是否有效。它们单独起作用,但不能结合起来。
我也试过将它们写在单独的if
语句中,但没有任何结果。
问题
有人能解释一下我在这个例子中做错了什么吗?我该怎么做才能让它检查这两个语句呢
有没有可能我实现上述功能,而不必为每个逻辑实现两个不同的代码?
参考资料清单
how to check the quantity of products in the woocommerce cart
Change flat rate shipping rate based on item cart totals belonging to specific shipping class
Conditionally Hide WooCommerce Shipping methods based on shipping class
Logical Operators - php manual
WC_Cart - WooCommerce Code Reference
1条答案
按热度按时间r8xiu3jd1#
所以主要的问题是我的逻辑表达。当我们使用
||
(OR)时,如果$a or $b
为true,它将返回true。而如果我们使用&&
(AND),如果两个$a and $b
都为真,它将返回true。我还确保循环遍历购物车项目,检查运输类,并单独添加变量。这使我的第一个表达式无效
$quantity_bottle < 6 && $quantity_gin < 6 && $quantity_box < 1
,但我的第二个表达式$quantity_gin == 2 && $cart_totals < 600
需要。为了使我的第一个表达式工作,我添加了一个新的变量,计数瓶数量和杜松子酒瓶数量的总和。所以条件是:
if (($quantity_bottle < 6 && $quantity_gin < 6 && $quantity_box < 1 && $total_bottle_quantity_cart < 6 ) && !($quantity_gin >= 2 && $subtotaltax > 600 ) )
完整代码如下: