调整WooCommerce购物车配送方式时出现PHP警告的原因排查
调整WooCommerce购物车配送方式时出现PHP警告的原因排查
嘿,这个警告我之前做WooCommerce自定义配送排序时也碰到过,给你拆解下问题根源和解决办法:
首先,这个PHP警告的核心原因很明确:你传给foreach()的$available_shipping_methods不是可遍历的类型——它大概率是null,或是字符串、数字这类没法用foreach循环的值。正常情况下woocommerce_package_rates钩子应该返回数组,但在一些特殊场景下会出现异常。
可能触发问题的场景
- 无可用配送方式:当购物车商品不符合任何配送方式的条件(比如重量超限、配送区域不匹配),WooCommerce标准逻辑应该返回空数组,但部分自定义主题/插件可能打乱这个逻辑,返回非数组结果。
- 其他钩子提前修改变量:如果有优先级比你更高的钩子(数值越小执行越早)先修改了
$available_shipping_methods,可能会把它改成非数组类型。 - 钩子参数异常:极端情况下,
$package参数本身出错,也会连带导致配送方式变量异常。
具体修复方案
最简单有效的办法是在执行foreach前先做严格校验,确保变量可遍历。直接修改你的代码即可:
add_filter('woocommerce_package_rates', 'wf_sort_shipping_methods', 10, 2); function wf_sort_shipping_methods($available_shipping_methods, $package) { // 先校验:如果变量不可遍历,直接返回原内容避免警告 if (!is_iterable($available_shipping_methods)) { return $available_shipping_methods; } // Arrange shipping methods as per your requirement $sort_order = array( 'wf_shipping_ups' => array(), 'flat_rate' => array(), 'local_pickup' => array(), 'request_shipping_quote' => array(), ); // unsetting all methods that needs to be sorted foreach($available_shipping_methods as $carrier_id => $carrier){ $carrier_name = current(explode(":",$carrier_id)); if(array_key_exists($carrier_name,$sort_order)){ $sort_order[$carrier_name][$carrier_id] = $available_shipping_methods[$carrier_id]; unset($available_shipping_methods[$carrier_id]); } } // adding methods again according to sort order array foreach($sort_order as $carriers){ $available_shipping_methods = array_merge($available_shipping_methods,$carriers); } return $available_shipping_methods; }
如果你的环境是PHP 7.0及以下(不支持is_iterable()),可以替换成这个校验逻辑:
if (!is_array($available_shipping_methods) && !is_object($available_shipping_methods)) { return $available_shipping_methods; }
另外,你也可以试试调整钩子优先级,把10改成20,让你的代码在其他可能修改配送方式的钩子之后执行,避免变量被提前改坏。
备注:内容来源于stack exchange,提问作者Wanderlust Consulting
相关产品推荐
相关产品推荐

