WooCommerce可变产品库存变体计数及单变体价格显示问题
嘿,我来帮你搞定这个WooCommerce可变产品的价格显示问题!你遇到的核心问题是当只剩一个有库存的变体时,价格会被隐藏,那我们就先从统计有库存的变体数量入手,再用这个数量来调整价格显示逻辑。
解决方案步骤
1. 先写个函数统计有库存的变体数量
这个函数会帮你数清楚当前可变产品里,到底有多少个变体是处于“有库存(in stock)”状态的:
// 统计产品中可用(有库存)的变体数量 function get_in_stock_variation_count( $product ) { // 如果不是可变产品,直接返回0 if ( ! $product->is_type( 'variable' ) ) { return 0; } $in_stock_count = 0; // 获取产品的所有可用变体 $all_variations = $product->get_available_variations(); // 挨个检查每个变体的库存状态 foreach ( $all_variations as $variation ) { $variation_product = wc_get_product( $variation['variation_id'] ); if ( $variation_product->is_in_stock() ) { $in_stock_count++; } } return $in_stock_count; }
2. 修改价格显示逻辑,加入数量判断
接下来我们把你原来的价格显示代码改一改,结合上面的库存数量来调整:
// 自定义可变产品价格显示逻辑 add_filter( 'woocommerce_variable_sale_price_html', 'custom_variable_product_price_display', 10, 2 ); add_filter( 'woocommerce_variable_price_html', 'custom_variable_product_price_display', 10, 2 ); function custom_variable_product_price_display( $price, $product ) { // 调用上面的函数,拿到有库存的变体数量 $in_stock_variations = get_in_stock_variation_count( $product ); // 情况1:只有1个有库存的变体,直接显示这个变体的价格 if ( $in_stock_variations === 1 ) { $available_variations = $product->get_available_variations(); foreach ( $available_variations as $variation ) { $variation_product = wc_get_product( $variation['variation_id'] ); if ( $variation_product->is_in_stock() ) { // 基础价格 $price = wc_price( $variation_product->get_price() ); // 如果是促销价,显示原价+促销价的格式 if ( $variation_product->is_on_sale() ) { $price = wc_format_sale_price( wc_price( $variation_product->get_regular_price() ), wc_price( $variation_product->get_sale_price() ) ); } break; } } } // 情况2:多个有库存的变体,隐藏价格区间,只显示选中变体的价格 else if ( $in_stock_variations > 1 ) { $price = ''; // 确保选中变体时能显示价格 add_filter( 'woocommerce_show_variation_price', '__return_true' ); } return $price; }
逻辑说明
- 当只有1个有库存的变体时:直接把这个变体的价格(包括促销价)显示出来,不会再隐藏
- 当有多个有库存的变体时:继续保持你想要的逻辑——隐藏价格区间,只有用户选中某个变体时才显示对应价格
注意事项
- 把这些代码添加到你当前主题的
functions.php文件末尾就行,或者用专门的代码片段插件来添加,这样主题更新时代码不会丢失 - 记得测试几种场景:比如多个变体都有货、只剩一个有货、全部缺货的情况,确保价格显示正常
内容的提问来源于stack exchange,提问作者Wed
相关产品推荐
相关产品推荐

