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; }
关键说明
- 配置灵活性:通过修改
$shipping_classes和$shipping_zones数组,可以轻松添加/修改配送类别和区域的规则,无需改动核心逻辑。 - 缓存清理:修改代码后,必须进入WooCommerce后台的「配送设置」,点击「保存更改」清空运费缓存,否则新规则不会立即生效。
- 税费处理:代码会自动根据原运费的税率计算新的税费,确保税费与总费用同步。
- 兼容性:适配WooCommerce 3.0+版本,支持多商品、多配送类别的混合购物车场景。
内容的提问来源于stack exchange,提问作者Shehab Zahran
相关产品推荐
相关产品推荐

