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
相关产品推荐
相关产品推荐

