自定义SMS通知插件导致WooCommerce订单后台商品图片不显示
问题原因排查
核心触发问题
你代码中注册的地址过滤器参数不匹配,是导致页面HTML结构被破坏、商品图片加载失败的直接原因:
- 你注册过滤器时指定接收3个参数:
add_filter( 'woocommerce_order_formatted_shipping_address', 'filter_woocommerce_order_formatted_shipping_address', 10, 3 ); add_filter( 'woocommerce_order_formatted_billing_address', 'filter_woocommerce_order_formatted_shipping_address', 10, 3 );
但对应的回调函数只定义了2个入参:
function filter_woocommerce_order_formatted_shipping_address( $array, $order )
PHP会抛出「缺少参数3」的警告,若站点开启了错误显示,警告内容会直接插入到页面HTML中,破坏商品图片标签结构,导致图片无法加载。
其他连带问题
sms_notif_filter_phone函数逻辑错误:你先将手机号强转为int类型,再用strpos查找字符串前缀,strpos要求入参为字符串类型,会抛出参数类型错误的PHP警告,进一步污染页面输出。- 自定义订单状态注册钩子不规范:
wc_register_post_statuses是动作钩子回调,应该用add_action挂载到init,你误用了add_filter,虽然不直接触发错误,但属于不规范用法。
修复方案
- 修正地址过滤器参数,二选一即可:
- 方案1:给回调函数补全第三个可选参数
function filter_woocommerce_order_formatted_shipping_address( $array, $order, $raw_address = null ) {
- 方案2:将过滤器的参数接收数量改为2
add_filter( 'woocommerce_order_formatted_shipping_address', 'filter_woocommerce_order_formatted_shipping_address', 10, 2 ); add_filter( 'woocommerce_order_formatted_billing_address', 'filter_woocommerce_order_formatted_shipping_address', 10, 2 );
- 修正手机号过滤函数逻辑:
function sms_notif_filter_phone($phone_number) { // 先转字符串处理前缀 $phone_str = trim((string)$phone_number); if (strpos($phone_str, '+216') === 0) { $phone_str = substr($phone_str, 4); } elseif (strpos($phone_str, '216') === 0) { $phone_str = substr($phone_str, 3); } // 清除非数字字符 $phone_str = preg_replace('/[^0-9]/', '', $phone_str); return strlen($phone_str) === 8 ? (int)$phone_str : null; }
- 修正订单状态注册钩子类型:
add_action( 'init', 'wc_register_post_statuses');
修改完成后清空缓存重新访问订单详情页即可恢复商品图片加载。
内容的提问来源于stack exchange,提问作者iheb CH
相关产品推荐
相关产品推荐

