我正在尝试修复以下 WooCommerce 代码片段,该代码片段应正确显示简单产品和可变产品的库存状态。
它适用于简单产品和可变产品,除了以下情况:所有变体都缺货,并且显示在库存中。
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 );
if ( $child->is_in_stock() ) {
$in_stock = true;
$all_variations_on_backorder = false;
} elseif ( !$child->is_in_stock() && $child->backorders_allowed() ) {
$on_backorder = true;
} 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>';
}
} 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>';
}
}
}
有什么想法吗?
谢谢,
尝试使用 $in_stock = true 进行初始化;没用。
您遇到的问题似乎源于代码片段如何处理所有缺货的变体。您检查 all_variations_on_backorder 的逻辑可能未正确设置。以下是可以优化的内容的详细说明:
问题: 该代码段适用于简单产品和可变产品,但在所有变体都处于缺货状态的情况下,它无法正确显示该条件。
解决方案: 您需要确保正确检查 all_variations_on_backorder,并且条件应正确区分库存、缺货和缺货状态。
优化代码: 尝试对逻辑进行以下调整:
add_shortcode( 'stock_status', 'display_product_stock_status' );
函数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 = true;
$on_backorder = false;
$all_variations_on_backorder = true;
foreach ( $children as $child_id ) {
$child = wc_get_product( $child_id );
if ( $child->is_in_stock() ) {
$in_stock = true;
$all_variations_on_backorder = false;
$out_of_stock = false;
} elseif ( !$child->is_in_stock() && $child->backorders_allowed() ) {
$on_backorder = true;
} else {
$out_of_stock = true;
$all_variations_on_backorder = false;
}
}
// Check if all variations are on backorder
if ( $all_variations_on_backorder ) {
return '<p class="stock on-backorder">Disponibil cu precomanda</p>';
}
// Display appropriate stock status
if ( $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 (toate variantele)</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>';
}
} 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>';
}
}
}
主要变化: $out_of_stock 现在被初始化为 true,这确保我们开始假设所有变体都缺货,除非另有证明。 对延期交货的所有变化的检查进行了调整,以更清楚地区分这种情况并返回正确的库存消息。 在一些不必要的情况下删除了多余的 all_variations_on_backorder 设置。 现在应该可以正确显示可变产品的库存状态,特别是在所有变体都处于缺货状态的情况下。如果有效请告诉我!