WooCommerce跨商品ID分组累计数量应用阶梯定价的实现问题
WooCommerce 商品分组阶梯定价解决方案
核心修正说明
- 统一使用
woocommerce_before_calculate_totals钩子处理价格计算,该钩子是WooCommerce官方指定的购物车价格修改触发点,不会出现订单提交异常问题 set_price()方法设置的是购物车商品最终结算价格,优先级高于商品本身的常规价/促销价,不需要额外修改商品原始定价即可正常生效- 内置ID分组配置、数量累计逻辑、阶梯价匹配逻辑,完全匹配你的业务规则
完整实现代码
// 按商品ID分组阶梯定价,触发在购物车、结算页总价计算前 add_action( 'woocommerce_before_calculate_totals', 'custom_group_tiered_pricing', 20, 1 ); function custom_group_tiered_pricing( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; // 配置商品ID分组和对应阶梯定价规则 $group_rules = [ 'a' => [ 'ids' => [1,2,3], // 替换为你的分组A实际商品ID 'tiers' => [ ['min' => 1, 'max' => 99, 'price' => 0.20], ['min' => 100, 'max' => 199, 'price' => 0.18], ['min' => 200, 'max' => PHP_INT_MAX, 'price' => 0.14], ] ], 'b' => [ 'ids' => [4,5,6], // 替换为你的分组B实际商品ID 'tiers' => [ ['min' => 1, 'max' => 99, 'price' => 0.30], ['min' => 100, 'max' => 199, 'price' => 0.28], ['min' => 200, 'max' => PHP_INT_MAX, 'price' => 0.20], ] ] ]; // 第一步:分别累计每个分组的总购买数量 $group_totals = []; $cart_items = $cart->get_cart(); foreach ($cart_items as $item) { $product_id = $item['product_id']; $qty = $item['quantity']; // 匹配当前商品所属分组 foreach ($group_rules as $group_key => $rule) { if (in_array($product_id, $rule['ids'])) { isset($group_totals[$group_key]) ? $group_totals[$group_key] += $qty : $group_totals[$group_key] = $qty; break; } } } // 第二步:按分组匹配阶梯价,设置商品最终结算价 foreach ($cart_items as $item) { $product_id = $item['product_id']; foreach ($group_rules as $group_key => $rule) { if (in_array($product_id, $rule['ids']) && isset($group_totals[$group_key])) { $total_qty = $group_totals[$group_key]; // 匹配对应阶梯 foreach ($rule['tiers'] as $tier) { if ($total_qty >= $tier['min'] && $total_qty <= $tier['max']) { $item['data']->set_price($tier['price']); break; } } break; } } } }
注意事项
- 代码中分组的ID、阶梯价格可以根据实际业务需求调整
- 若修改后价格未生效,可先排查是否有其他WooCommerce价格相关插件优先级高于当前钩子(可将钩子的优先级数值20调大,比如改为99,提高当前逻辑的执行优先级)
- 该方案修改的仅为购物车结算时的动态价格,不会修改商品后台录入的原始定价
内容的提问来源于stack exchange,提问作者AntonioA
相关产品推荐
相关产品推荐

