WooCommerce 如何判断购物车同时包含shoes与hats产品分类
函数修改方案
核心逻辑调整说明
原函数的判断逻辑是「逐个校验每个购物车商品是否属于指定分类集合,最终要求所有商品都落在指定分类范围内才触发动作」,和当前需要的「全购物车维度判断是否同时存在shoes、hats两个分类的商品,而非只满足单个分类、也不要求所有商品都属于目标分类」的需求完全不匹配,需要做如下调整:
- 废弃原来存储单商品布尔校验结果的数组,替换为两个独立标记位,分别记录购物车中是否出现过shoes类商品、是否出现过hats类商品
- 遍历每个购物车商品时,单独校验商品所属分类,只要命中对应分类就将对应标记设为
true - 遍历完成所有购物车商品后,仅当两个标记同时为真时,才触发后续的消息展示逻辑
修改后的完整可运行代码
function check_the_cart_for_categories() { // 初始化分类存在标记 $has_shoes = false; $has_hats = false; // 初始化原有业务变量,避免未定义警告 $ship_check = true; // 逐行遍历购物车商品 foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; // 使用WooCommerce兼容写法获取产品ID $product_id = $product->get_id(); // 命中对应分类就更新标记状态 if ( has_term( 'shoes', 'product_cat', $product_id ) ) { $has_shoes = true; } if ( has_term( 'hats', 'product_cat', $product_id ) ) { $has_hats = true; } } // 双分类同时存在时触发展示逻辑 if ( $has_shoes && $has_hats && $ship_check ) { echo "showmessage"; } } add_action( 'woocommerce_proceed_to_checkout' , 'check_the_cart_for_categories'); add_action( 'woocommerce_review_order_before_submit' , 'check_the_cart_for_categories');
注意事项
- 代码中填写的
shoes、hats必须和Word后台产品分类设置的别名(slug)完全一致,否则has_term()会校验失败 - 如果后续需要补充其他分类的联合判断,只需要新增对应标记位、在遍历逻辑中补充校验规则即可
- 如果业务上还需要限制“购物车里不能有其他分类的商品”,可以在最终判断条件里再追加对应校验规则
内容的提问来源于stack exchange,提问作者Patrick Duke Schauer
相关产品推荐
相关产品推荐

