You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 13:06:04