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

WooCommerce flat rate:基于配送区域额外加费及多配置需求

解决方案:整合阶梯运费与区域附加费(支持多类别/多区域)

问题根源

你之前的两段代码使用了相同优先级(10)的woocommerce_package_rates钩子,执行顺序不可控,可能导致后执行的代码覆盖前一段的计算结果,或者部分逻辑不生效。将两个功能整合到同一个函数里可以彻底解决这个问题,同时满足多配送类别、多区域的配置需求。

完整可复用代码

add_filter( 'woocommerce_package_rates', 'custom_shipping_costs_with_tiers_and_zone_surcharges', 10, 2 );
function custom_shipping_costs_with_tiers_and_zone_surcharges( $rates, $package ) {
    // --------------------------
    // 配置区域:按需修改以下参数
    // --------------------------
    // 多配送类别阶梯规则:slug => [阶梯数量, 阶梯费用(美元)]
    $shipping_classes = [
        'very-light-weight' => [3, 4], // 每3件收4美元
        'another-shipping-class' => [5, 6] // 示例:每5件收6美元
    ];
    
    // 多配送区域附加费:区域名称 => 附加费用(美元)
    $shipping_zones = [
        'Your Shipping Zone Name' => 50, // 指定区域加收50美元
        'Another Zone' => 20 // 示例:另一区域加收20美元
    ];

    // 1. 计算所有目标配送类别的阶梯运费总和
    $total_tier_cost = 0;
    foreach( $shipping_classes as $class_slug => $tier_rules ) {
        list($qty_step, $step_cost) = $tier_rules;
        $class_id = get_term_by('slug', $class_slug, 'product_shipping_class')?->term_id;
        if( !$class_id ) continue;

        $item_count = 0;
        foreach( $package['contents'] as $cart_item ) {
            if( $cart_item['data']->get_shipping_class_id() == $class_id ){
                $item_count += $cart_item['quantity'];
            }
        }

        if( $item_count > 0 ){
            $total_tier_cost += ceil( $item_count / $qty_step ) * $step_cost;
        }
    }

    // 2. 获取当前配送区域的附加费
    $zone_surcharge = 0;
    $zone = WC_Shipping_Zones::get_zone_matching_package($package);
    $zone_name = $zone->get_zone_name();
    if( isset($shipping_zones[$zone_name]) ){
        $zone_surcharge = $shipping_zones[$zone_name];
    }

    // 3. 更新所有Flat Rate运费的费用及税费
    foreach ( $rates as $rate_key => $rate ){
        if( 'flat_rate' === $rate->method_id ) {
            // 计算总费用:原基础费用 + 阶梯运费 + 区域附加费
            $new_cost = $rate->cost + $total_tier_cost + $zone_surcharge;
            $rates[$rate_key]->cost = $new_cost;

            // 同步更新税费(如果启用)
            if( !empty($rate->taxes) ){
                $tax_rate = $rate->taxes[0] / $rate->cost; // 计算原税率
                $new_taxes = [ $new_cost * $tax_rate ];
                $rates[$rate_key]->taxes = $new_taxes;
            }
        }
    }

    return $rates;
}

关键说明

  1. 配置灵活性:通过修改$shipping_classes和$shipping_zones数组,可以轻松添加/修改配送类别和区域的规则,无需改动核心逻辑。
  2. 缓存清理:修改代码后,必须进入WooCommerce后台的「配送设置」,点击「保存更改」清空运费缓存,否则新规则不会立即生效。
  3. 税费处理:代码会自动根据原运费的税率计算新的税费,确保税费与总费用同步。
  4. 兼容性:适配WooCommerce 3.0+版本,支持多商品、多配送类别的混合购物车场景。

内容的提问来源于stack exchange,提问作者Shehab Zahran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:44:55