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

WooCommerce变量产品全预订状态库存显示异常问题修复求助

问题修复:WooCommerce变量产品全预订状态显示错误

问题根源

WooCommerce的is_in_stock()方法对于允许预订(backorder)的变体,即使库存为0也会返回true,这导致原代码误将所有预订状态的变体判定为“有库存”,跳过了$all_variations_on_backorder的判断逻辑,最终错误显示库存状态。

修复后的代码

add_shortcode( 'stock_status', 'display_product_stock_status' );
function display_product_stock_status( $atts) {

    $atts = shortcode_atts(
        array('id'  => get_the_ID() ),
        $atts, 'stock_status'
    );

    $product = wc_get_product( $atts['id'] );

    if ( $product->is_type( 'variable' ) ) {
        $children = $product->get_children();

        $in_stock = false;
        $out_of_stock = false;
        $on_backorder = false;
        $all_variations_on_backorder = true;

        foreach ( $children as $child_id ) {
            $child = wc_get_product( $child_id );
            $stock_qty = $child->get_stock_quantity();
            
            // 判断真正的有库存:库存数量>0
            if ( $stock_qty > 0 ) {
                $in_stock = true;
                $all_variations_on_backorder = false;
            } 
            // 判断预订状态:库存<=0且允许预订
            elseif ( $stock_qty <= 0 && $child->backorders_allowed() ) {
                $on_backorder = true;
                // 仅当所有变体都是该状态时,$all_variations_on_backorder保持true
            } 
            // 完全缺货:库存<=0且不允许预订
            else {
                $out_of_stock = true;
                $all_variations_on_backorder = false;
            }
        }

        if ( $all_variations_on_backorder ) {
            return '<p class="stock on-backorder">Disponibil cu precomanda</p>';
        } elseif ( $in_stock && !$out_of_stock && !$on_backorder ) {
            return '<p class="stock in-stock">In stoc</p>';
        } elseif ( !$in_stock && $out_of_stock && !$on_backorder ) {
            return '<p class="stock out-of-stock">Stoc epuizat</p>';
        } elseif ( $in_stock && $out_of_stock && !$on_backorder ) {
            return '<p class="stock in-stock">In stoc (unele variante)</p>';
        } elseif ( $in_stock && !$out_of_stock && $on_backorder ) {
            return '<p class="stock in-stock">In stoc, Disponibil cu precomanda (unele variante)</p>';
        } elseif ( !$in_stock && $out_of_stock && $on_backorder ) {
            return '<p class="stock on-backorder">Disponibil cu precomanda (unele variante), Stoc epuizat (unele variante)</p>';
        } elseif ( $in_stock && $out_of_stock && $on_backorder ) {
            return '<p class="stock in-stock">In stoc (unele variante), Disponibil cu precomanda (unele variante)</p>';
        }
        // 兜底处理:避免无匹配条件时无返回值
        return '<p class="stock on-backorder">Disponibil cu precomanda</p>';
    } else {
        $stock_status = $product->get_stock_status();

        if ( 'instock' == $stock_status) {
            return '<p class="stock in-stock">In stoc</p>';
        }
        if ( 'out-of-stock' == $stock_status ){
            return '<p class="stock out-of-stock">Stoc epuizat</p>';
        }
        if ( 'onbackorder' == $stock_status ){
            return '<p class="stock on-backorder">Disponibil cu precomanda</p>';
        }
    }
}

关键修改点

  • 替换库存判断逻辑:不再依赖is_in_stock(),改为直接检查get_stock_quantity()数值,精准区分“实际有库存”和“仅允许预订”的状态
  • 修正批量预订状态判定:只有当所有变体都处于“库存为空且允许预订”时,$all_variations_on_backorder才保持true;遇到其他状态变体时立即置为false
  • 增加兜底返回:防止所有条件都不匹配时出现无返回值的异常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:57:33