WooCommerce Shipping: 如何根据配送距离/半径条件隐藏配送方式
基于WooCommerce原生钩子的实现方案
该方案不需要更换现有插件,直接通过WooCommerce自带的过滤器实现自定义配送方式隐藏逻辑,兼容性更高,可自定义空间大。
核心实现逻辑
通过woocommerce_package_rates过滤器钩子,在配送方式列表渲染前,结合计算好的配送距离值,筛选移除不符合条件的配送方式即可。
具体操作步骤
1. 确认配送距离的获取方式
你可以直接复用已安装的WooCommerce Distance Rate Shipping插件的距离计算结果,插件计算完成后会将距离数值存储在用户购物车会话中,无需额外对接地图API重复计算。如果不想依赖该插件,也可以自行对接地图服务商的距离矩阵接口计算收货地址到发货地的距离。
2. 插入自定义过滤代码
将以下代码添加到站点当前主题的functions.php文件中,或通过Code Snippets这类自定义代码插件插入,避免修改主题源码升级时被覆盖:
add_filter('woocommerce_package_rates', 'hide_shipping_method_by_distance', 10, 2); function hide_shipping_method_by_distance($rates, $package) { // 调取已计算好的配送距离,单位为公里,如自行计算可替换为你自己的距离取值逻辑 $calculated_distance = WC()->session->get('distance_rate_shipping_distance'); // 无法获取距离时不修改配送方式列表 if (empty($calculated_distance)) { return $rates; } foreach ($rates as $rate_id => $rate_info) { // 距离<=50公里时隐藏配送方式A,替换为你后台对应配送方式的实际slug if ($calculated_distance <= 50 && $rate_info->method_id === 'shipping_method_a_slug') { unset($rates[$rate_id]); } // 距离>=51公里时隐藏配送方式B,替换为你后台对应配送方式的实际slug if ($calculated_distance >= 51 && $rate_info->method_id === 'shipping_method_b_slug') { unset($rates[$rate_id]); } } return $rates; }
3. 替换参数并测试生效
- 进入WooCommerce后台「设置」-「配送」页面,鼠标悬停在对应配送方式上,即可在浏览器底部状态栏看到该配送方式的slug,替换代码中对应的占位符
- 配置完成后清空WooCommerce运输缓存,分别填写50公里以内、51公里以上的收货地址,测试配送方式的展示是否符合预期
- 若调试时发现距离取值为空,可打印
WC()->session的所有会话数据,确认距离存储的字段名是否与示例代码一致
注意事项
- 修改配送方式相关配置后,必须清空WooCommerce运输缓存,否则规则不会立即生效
- 站点的缓存插件需要排除购物车、结算页的缓存,避免配送方式过滤逻辑被缓存导致所有用户展示相同的配送选项
- 如果自行对接国内地图API计算距离,注意处理坐标偏移问题,避免GCJ02和WGS84坐标混用导致距离计算误差
内容的提问来源于stack exchange,提问作者PMaly
相关产品推荐
相关产品推荐

