Woocommerce调用null对象get_stock_quantity()报错排查求助
错误根因分析
- 堆栈日志显示WPML翻译队列后台页面调用
woocommerce_get_availability_text过滤器时,传入的第二个产品参数为NULL,你在自定义函数中额外声明了global $product覆盖了过滤器传入的参数,而WPML后台页面不存在全局初始化的产品对象,所以调用get_stock_quantity()时直接触发空对象报错 - 该问题和你使用的空翻译字符串
__( '', 'babasouk' )无关联,不需要调整翻译写法
修复方案
你需要对自定义代码做三处调整:删除多余的全局产品声明、增加产品对象有效性校验、补充分类判断的产品ID参数,修复后的完整代码如下:
function bbloomer_show_stock_shop() { global $product; echo wc_get_stock_html( $product ); } // CHANGE STOCK MESSAGES add_filter( 'woocommerce_get_availability_text', 'bbloomer_custom_get_availability_text', 99, 2 ); function bbloomer_custom_get_availability_text( $availability, $product ) { // 先校验产品对象是否有效,无效直接返回原文本 if ( ! is_a( $product, 'WC_Product' ) ) { return $availability; } $stock = $product->get_stock_quantity(); // 全局库存规则 if ( ! $product->is_in_stock() ) { $availability = __( 'Sorry, I am sold out!', 'babasouk' ); } if ( $product->is_in_stock() && $stock >= 2 ) { $availability = __( '', 'babasouk' ); } // 分类排除规则,补全产品ID参数 if ( has_term( array( 'ORIGINAL ARTWORKS', 'OEUVRES ORIGINALES' ), 'product_cat', $product->get_id() ) ) { if ( $product->is_in_stock() && $stock == 1 ) { $availability = __( '', 'babasouk' ); } } else if ( $product->is_in_stock() && $stock == 1 ) { $availability = __( 'Only 1 Available!', 'babasouk' ); } return $availability; }
验证步骤
- 替换主题functions.php中原代码后,先访问WPML翻译队列页面确认不再触发致命错误
- 再访问前台商品分类页、商品详情页,确认库存提示逻辑和修改前完全一致即可
内容的提问来源于stack exchange,提问作者user9557
相关产品推荐
相关产品推荐

