WooCommerce变量产品仅启用库存管理时显示自定义库存消息
问题修复:可变产品库存统计与定制产品隐藏库存消息
问题描述
现有代码用于统计可变产品所有变体的库存总量并显示对应消息,但存在以下异常:
- 对于产品及变体均未开启库存管理的定制订单类产品,分类页会错误显示“Sorry, I am sold out!”,单品页选择变体时显示无数字的“Only Available”。
- 尝试用
if ( $product->managing_stock() )包裹代码排除未启用库存管理的产品,但未生效。
问题原因
$product->managing_stock()仅检查父产品的库存管理状态,而可变产品的库存管理可能单独在变体级别开启/关闭,导致判断不准确。- 当所有变体都未开启库存管理时,SQL查询返回
$stock_quantity = null,原代码逻辑会误判进入错误分支,输出错误消息。
修复后的代码
// 统计可变产品所有变体的库存总量并输出对应消息 function wc_get_variable_product_stock_quantity( $output = 'raw', $product_id = 0 ){ global $wpdb, $product; // 获取产品ID $product_id = $product_id > 0 ? $product_id : get_the_id(); // 获取WC_Product对象实例 $product = is_a( $product, 'WC_Product' ) ? $product : wc_get_product($product_id); // 仅处理可变产品 if( !$product->is_type('variable') ){ return; } // 检查是否存在开启库存管理的变体(或父产品开启库存管理) $has_stock_managed_variations = false; $variations = $product->get_available_variations(); foreach( $variations as $variation ){ $variation_product = wc_get_product( $variation['variation_id'] ); if( $variation_product->managing_stock() ){ $has_stock_managed_variations = true; break; } } // 如果父产品和所有变体都未开启库存管理,直接返回,不显示任何消息 if( !$product->managing_stock() && !$has_stock_managed_variations ){ return; } // 统计所有变体的库存总量 $stock_quantity = $wpdb->get_var( " SELECT SUM(pm.meta_value) FROM {$wpdb->prefix}posts as p JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND p.post_status = 'publish' AND p.post_parent = '$product_id' AND pm.meta_key = '_stock' AND pm.meta_value IS NOT NULL AND pm.meta_value != '' " ); // 如果库存总量为null(无有效库存数据),直接返回 if( is_null($stock_quantity) ){ return; } // 格式化输出内容 $html = ''; if ( $stock_quantity > 0 && $stock_quantity <= 5 ) { $html = '<p class="stock in-stock">'. __('Only ' . $stock_quantity . ' Available!', 'babasouk').'</p>'; } elseif ( $stock_quantity == 0 ) { $html = '<p class="stock out-of-stock">' . __('Sorry, I am sold out!', 'babasouk') . '</p>'; } // 根据输出类型处理 if( $output == 'echo_html' ){ echo $html; } elseif( $output == 'return_html' ){ return $html; } else { return $stock_quantity; } } // 在分类页显示可变产品库存信息 add_action( 'woocommerce_after_shop_loop_item_title', 'display_variable_product_stock_quantity', 20 ); function display_variable_product_stock_quantity(){ wc_get_variable_product_stock_quantity( 'echo_html' ); }
修复说明
- 精准判断库存管理状态:新增检查所有变体的库存管理状态,只有当父产品或任一变体开启库存管理时,才继续处理库存统计。
- 处理null值情况:当SQL查询返回
null(无有效库存数据)时,直接返回,不输出任何消息。 - 优化SQL查询:新增
pm.meta_value != ''条件,排除空值的库存记录。 - 简化逻辑分支:调整条件判断顺序,避免误判进入错误分支。
内容的提问来源于stack exchange,提问作者user9557
相关产品推荐
相关产品推荐

