WooCommerce购物车含ambient商品时仍需校验chilled类最小下单量问题
问题根因
你代码的bug出在校验规则的触发条件上:遍历完所有购物车商品后,$product变量保存的是购物车最后一个商品的信息。如果最后一个商品是ambient类目,那has_term( 'chilled', 'product_cat', $product['product_id'] )这个判断就会返回假,哪怕前面有chilled类商品也不会触发校验逻辑,这就是添加其他类目商品后规则失效的核心原因。
你完全不需要判断最后一个商品的类目,只要统计到的$total_protein大于0(说明购物车有chilled类商品)同时小于最小数量3,就触发报错即可。
修正后代码
// 设置结账前冷藏类商品的最低购买数量 add_action( 'woocommerce_check_cart_items', 'protein_set_min_total' ); function protein_set_min_total() { // 仅在购物车或结账页面运行 if( is_cart() || is_checkout() ) { global $woocommerce; // 设置冷藏类商品最低购买数量,初始化计数变量 $minimum_protein = 3; $total_protein = 0; // 遍历购物车所有商品统计冷藏类数量 foreach ( $woocommerce->cart->cart_contents as $product ) : if ( has_term( 'chilled', 'product_cat', $product['product_id'] ) ) { $total_protein += $product['quantity']; } endforeach; // 只要购物车有冷藏类商品且数量不足3就触发报错 if ( $total_protein > 0 && $total_protein < $minimum_protein) { wc_add_notice( sprintf( '<strong>结账前需要至少购买%s件冷藏类目商品</strong>' . '<br />当前购物车内冷藏类商品数量:%s', $minimum_protein, $total_protein ), 'error' ); } } }
额外优化说明
- 删掉了没用的全局变量
$product、未使用的计数变量$i和$cat_in_cart,精简代码 - 修正了原来的HTML转义字符错误,把
>改回正常的>符号 - 逻辑判断更直接,不会受其他类目商品的影响,只要存在冷藏类商品就会校验数量要求
内容的提问来源于stack exchange,提问作者Giuls
相关产品推荐
相关产品推荐

