WooCommerce如何在结账页显示指定配送选项?添加选项触发致命错误
解决WooCommerce结账页添加特定配送选项的致命错误问题
错误根源
你直接用array_push($rates, 'flat_rate:5')添加字符串是错的——$rates数组里的元素不是字符串,而是WC_Shipping_Rate对象,键是配送方式ID(比如flat_rate:5),值是对应的对象实例。强行插入字符串会导致WooCommerce后续处理时触发类型不匹配的致命错误。
修正后的代码
下面是可以正确添加指定配送方式的代码,核心是获取对应配送方式的对象实例再加入数组:
add_filter( 'woocommerce_package_rates', 'custom_package_rates', 10, 2 ); function custom_package_rates( $rates, $package ) { // 用当前包裹的内容总价更准确(支持多包裹场景) $total = $package['contents_cost']; if( $total < 100 ) { // 移除不需要的配送选项 unset( $rates['advanced_free_shipping'] ); // 检查目标配送方式是否不在当前列表中 if ( ! isset( $rates['flat_rate:5'] ) ) { // 获取当前包裹匹配的配送区域 $shipping_zone = WC_Shipping_Zones::get_zone_matching_package( $package ); // 获取指定ID的配送方式实例 $shipping_method = $shipping_zone->get_shipping_method( 'flat_rate:5' ); if ( $shipping_method && $shipping_method->is_enabled() ) { // 创建对应的WC_Shipping_Rate对象 $rate = new WC_Shipping_Rate( 'flat_rate:5', $shipping_method->get_title(), $shipping_method->cost, $shipping_method->get_taxes(), 'flat_rate' ); // 添加到rates数组(键必须是配送方式ID) $rates['flat_rate:5'] = $rate; } } } return $rates; }
关键注意事项
- 确保
flat_rate:5这个配送方式ID正确:在WooCommerce后台配送→配送方式里编辑对应平邮方式时,可从URL中获取ID(比如URL为...post.php?post=5&action=edit,则ID为flat_rate:5)。 - 该配送方式必须在当前用户的配送区域内启用,否则
get_shipping_method会返回null,无法添加。 - 代码生效前需清空WooCommerce缓存(后台→系统状态→工具→清除配送缓存),避免旧规则干扰。
内容的提问来源于stack exchange,提问作者Phobos
相关产品推荐
相关产品推荐

