WooCommerce单产品页库存状态显示问题求助:无库存管理场景适配
解决方案
你的问题核心在于未处理**禁用库存管理(无限库存)**的场景,同时代码存在几处细节问题:
- 冗余调用
global $product,函数参数已提供$_product,易引发变量冲突 - 未判断是否启用库存管理,禁用时
get_stock_quantity()返回null,导致文案拼接异常 - 条件判断顺序不合理,预订状态会被在库存状态覆盖
- 过滤器优先级过低,可能被其他插件/主题的设置覆盖
以下是修复后的代码:
add_filter( 'woocommerce_get_availability', 'custom_product_stock_availability', 999, 2 ); function custom_product_stock_availability( $availability, $_product ) { // 先处理预订状态(优先级最高,避免被其他状态覆盖) if ( $_product->is_on_backorder() ) { $availability['availability'] = __( '预订文案', 'woocommerce' ); return $availability; } // 处理无库存状态 if ( ! $_product->is_in_stock() ) { $availability['availability'] = __( '缺货文案', 'woocommerce' ); return $availability; } // 区分库存管理状态,处理有库存/无限库存场景 if ( $_product->managing_stock() ) { // 启用库存管理,显示带数量的文案 $stock_quantity = $_product->get_stock_quantity(); $availability['availability'] = sprintf( __( '库存剩余 %s 件', 'woocommerce' ), $stock_quantity ); } else { // 禁用库存管理(无限库存),显示自定义在库文案 $availability['availability'] = __( '现货供应', 'woocommerce' ); } return $availability; }
关键改动说明:
- 调高过滤器优先级:设为
999,确保自定义逻辑能覆盖WooCommerce默认或其他插件的设置 - 优化条件顺序:先判断预订状态,再处理无库存,最后覆盖有库存/无限库存场景,避免状态被覆盖
- 增加库存管理判断:通过
$_product->managing_stock()区分是否启用库存管理,针对无限库存单独设置文案 - 移除冗余全局变量:直接使用函数传入的
$_product参数,避免变量冲突 - 使用
sprintf拼接文案:更符合多语言本地化规范,方便后续翻译适配
多语言适配提示:
所有文案都通过__()函数包裹,在WooCommerce多语言插件(如WPML、Polylang)中添加对应语言的翻译即可实现多语言切换。
内容的提问来源于stack exchange,提问作者roboj
相关产品推荐
相关产品推荐

