I am trying to fix the following WooCommerce snippet which should display correctly the stock status for simple products and variable products.
It works well with simple product and variable products except for the case where all the variations are on backorder, and it displays on stock.
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>';
}
}
}
Any ideas?
I tried to initialize with $in_stock = true;
, but it didn’t work.
2