求助:如何实现基于购物车小计与指定分类自动添加WooCommerce商品至购物车
解决WooCommerce按指定分类商品总金额自动添加商品的问题
我明白你的需求啦——你已经能判断购物车里有没有指定分类的商品,但卡在了计算这些分类商品的总金额是否达到设定最小值这一步。咱们来一步步修正你的代码:
原代码的问题点
你之前的代码里$product_subtotal没有定义,而且逻辑上只是检查单个商品的金额,不是累加指定分类下所有商品的总金额,这就导致金额判断完全失效了。
修正后的完整代码
add_action( 'woocommerce_before_calculate_totals', 'auto_add_item_based_on_product_category', 10, 1 ); function auto_add_item_based_on_product_category( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; $min_price = 77.47; // 最低购物车金额(指定分类商品总金额) $required_categories = array('computer-based', 'esami-paper-based'); // 指定商品分类 $added_product_id = 5065; // 自动添加的特定商品ID $category_subtotal = 0; // 初始化指定分类商品的总金额 $added_item_key = ''; // 记录已添加的目标商品在购物车中的key // 遍历购物车商品,完成两个核心操作:累加指定分类金额、检查目标商品是否已存在 foreach ( $cart->get_cart() as $item_key => $item ) { $product_id = $item['product_id']; // 1. 累加指定分类商品的总金额 if( has_term( $required_categories, 'product_cat', $product_id ) ) { $category_subtotal += $item['line_subtotal']; // 累加该商品的小计(不含运费/税费) } // 2. 检查目标商品是否已经在购物车里 if( $product_id == $added_product_id ) { $added_item_key = $item_key; } } // 判断是否满足添加条件:指定分类总金额达标,且目标商品未在购物车中 $should_add = ( $category_subtotal >= $min_price ) && empty( $added_item_key ); // 判断是否需要移除:指定分类总金额不达标,但目标商品已经在购物车中 $should_remove = ( $category_subtotal < $min_price ) && !empty( $added_item_key ); // 执行添加或移除操作 if ( $should_add ) { $cart->add_to_cart( $added_product_id ); } elseif ( $should_remove ) { $cart->remove_cart_item( $added_item_key ); } }
关键修改说明
- 累加指定分类金额:新增
$category_subtotal变量,遍历购物车时,只要商品属于指定分类,就把它的line_subtotal(商品的小计,即数量×单价,不含额外费用)累加到这个变量里。 - 简化逻辑判断:把添加和移除的条件拆成清晰的
$should_add和$should_remove,让代码更容易维护。 - 更严谨的状态检查:确保只有当金额达标且目标商品不在购物车时才添加;金额不达标但目标商品已存在时则移除,覆盖了所有场景。
这样修改后,就能准确实现“当指定分类商品总金额达到设定最小值时自动添加特定商品,金额不够时自动移除”的需求啦!
内容的提问来源于stack exchange,提问作者indave
相关产品推荐
相关产品推荐

