You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce变量产品仅启用库存管理时显示自定义库存消息

问题修复:可变产品库存统计与定制产品隐藏库存消息

问题描述

现有代码用于统计可变产品所有变体的库存总量并显示对应消息,但存在以下异常:

  • 对于产品及变体均未开启库存管理的定制订单类产品,分类页会错误显示“Sorry, I am sold out!”,单品页选择变体时显示无数字的“Only Available”。
  • 尝试用if ( $product->managing_stock() )包裹代码排除未启用库存管理的产品,但未生效。

问题原因

  1. $product->managing_stock()仅检查父产品的库存管理状态,而可变产品的库存管理可能单独在变体级别开启/关闭,导致判断不准确。
  2. 当所有变体都未开启库存管理时,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' );
}

修复说明

  1. 精准判断库存管理状态:新增检查所有变体的库存管理状态,只有当父产品或任一变体开启库存管理时,才继续处理库存统计。
  2. 处理null值情况:当SQL查询返回null(无有效库存数据)时,直接返回,不输出任何消息。
  3. 优化SQL查询:新增pm.meta_value != ''条件,排除空值的库存记录。
  4. 简化逻辑分支:调整条件判断顺序,避免误判进入错误分支。

内容的提问来源于stack exchange,提问作者user9557

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:55:20