You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 09:43:11