如何根据购物车小计调整WooCommerce指定州的UPS 3-Day-Air配送费用?
解决方案
可以实现这个需求,只需在原有woocommerce_package_rates过滤器中加入购物车小计判断和配送州验证逻辑即可。以下是修改后的完整代码:
add_filter( 'woocommerce_package_rates', function( $shipping_costs, $package ) { // 定义允许应用该费率规则的州(替换为你实际需要的两个州代码) $allowed_states = array('CA', 'NY'); // 获取当前用户选择的配送州 $shipping_state = $package['destination']['state']; // 定义基础最低费率与优惠后费率 $base_min_cost = 69.95; $discounted_min_cost = 19.95; // 获取购物车商品小计(不含税、不含运费) $cart_subtotal = WC()->cart->get_subtotal(); // 初始化最终使用的最低费率 $min_cost = $base_min_cost; // 条件判断:仅当配送州在指定列表且购物车小计超200美元时,使用优惠费率 if ( in_array( $shipping_state, $allowed_states ) && $cart_subtotal > 200 ) { $min_cost = $discounted_min_cost; } // 目标配送方式ID(UPS 3-Day-Air) $target_method_id = 'wf_shipping_ups:12'; foreach( $shipping_costs as $shipping_cost ) { $shipping_method_id = $shipping_cost->get_id(); if( $shipping_method_id === $target_method_id ) { $cost = (float) $shipping_cost->get_cost(); // 取UPS实时费率与最低费率中的较高值 if( $cost < $min_cost ) { $shipping_cost->set_cost($min_cost); } } } return $shipping_costs; }, 10, 2 ); // 需传入第2个参数$package,因此过滤器参数数量指定为2
关键说明
- 配送州匹配:通过
$package['destination']['state']获取用户配送地址的州信息,确保规则仅在你指定的两个州内生效,与你已有的配送方式显示逻辑兼容。 - 小计判断逻辑:使用
WC()->cart->get_subtotal()获取购物车商品的原始小计(不含税和运费),当金额超过200美元时自动切换为优惠费率。 - 参数传递调整:原代码未使用
$package参数,因此需要在回调函数中添加该参数,并在add_filter末尾指定接受2个参数(默认仅1个)。 - 费率逻辑保留:维持原有的“取实时费率与最低费率较高值”的规则,仅根据条件动态切换最低费率的数值。
注意事项
- 将
$allowed_states数组中的州代码替换为你实际需要的两个州(例如'TX'代表德克萨斯州,'FL'代表佛罗里达州)。 - 修改代码后,需进入WooCommerce后台清空配送费率缓存:路径为「WooCommerce > 设置 > 配送 > 配送选项」,点击“清除缓存”按钮,确保新规则生效。
- 测试时请切换到指定州的配送地址,分别调整购物车金额至200美元以上/以下,验证费率是否正确变化。
内容的提问来源于stack exchange,提问作者whats_the_rush
相关产品推荐
相关产品推荐

