如何为同一国家设置多个WooCommerce配送区域并同时显示所有配送方式
WooCommerce多配送区域全量配送方式展示解决方案
实现原理
WooCommerce默认的配送区域匹配逻辑为检索到排序最靠前(范围最窄)的匹配配送区域后即终止检索,仅返回该区域绑定的配送方式。通过修改配送区域匹配钩子,可遍历所有符合用户收货地址的配送区域,汇总所有对应的配送方式后在结算页展示。
代码实现
将以下代码添加至站点当前活跃主题的functions.php文件,或独立自定义插件中即可生效:
// 检索所有匹配收货地址的配送区域 add_filter( 'woocommerce_shipping_zones_for_package', 'get_all_matched_shipping_zones', 10, 2 ); function get_all_matched_shipping_zones( $matched_zones, $package ) { $matched_zones = []; // 获取所有配置的配送区域+默认兜底区域 $all_zones = WC_Shipping_Zones::get_zones(); $all_zones[] = new WC_Shipping_Zone(0); foreach ($all_zones as $zone) { if (is_a($zone, 'WC_Shipping_Zone') && $zone->is_valid_for_package($package)) { $matched_zones[] = $zone; } } return $matched_zones; } // 可选:配送方式去重,避免多个区域包含相同配送方式时重复展示 add_filter( 'woocommerce_package_rates', 'deduplicate_shipping_methods', 10, 2 ); function deduplicate_shipping_methods( $rates, $package ) { $unique_rates = []; foreach ($rates as $rate_id => $rate) { // 以配送方式ID+配送费用作为去重标识,可按需调整规则 $identifier = $rate->method_id . '_' . $rate->get_cost(); if (!isset($unique_rates[$identifier])) { $unique_rates[$rate_id] = $rate; } } return $unique_rates; }
注意事项
- 代码生效后需清空WooCommerce缓存、浏览器缓存后测试
- 可根据业务需求调整去重规则,或添加额外的配送方式筛选逻辑
- WooCommerce大版本更新后建议复测功能兼容性
内容的提问来源于stack exchange,提问作者s011420
相关产品推荐
相关产品推荐

