当所有变体都缺货时,在 WooCommerce 可变产品上显示售罄
Display sold out on WooCommerce variable product when all variations are out of stock
在 WooCommerce 中,我使用下面的功能,如果产品缺货,它会在产品缩略图上添加售罄文本:
add_action( 'woocommerce_before_shop_loop_item_title', 'bbloomer_display_sold_out_loop_woocommerce' );
function bbloomer_display_sold_out_loop_woocommerce() {
global $product;
if ( ! $product->is_in_stock() ) {
echo '<span class="soldout">Sold Out</span>';
}
}
它适用于简单产品,但不适用于可变产品。
对于有变体的可变产品,如果我将除 1 个变体之外的所有变体都设置为 0 库存数量,我注意到缩略图上仍然显示售罄消息。从技术上讲,这是不正确的,因为我们确实有一些库存。
有人知道如何更改下面的代码来处理这个问题吗?
您可以创建自定义条件函数来检查可变产品的所有变体是否都“缺货”,如下所示:
function is_variable_product_out_of_stock( $product ) {
$children_count = 0; // initializing
$variation_ids = $product->get_visible_children();
// Loop through children variations of the parent variable product
foreach( $variation_ids as $variation_id ) {{
$variation = wc_get_product($_variation_id); // Get the product variation Object
if( ! $variation->is_in_stock() ) {
$children_count++; // count out of stock children
}
}
// Compare counts and return a boolean
return count($variation_ids) == $children_count ? true : false;
}
然后您将在下面重新访问的挂钩函数中使用它:
add_action( 'woocommerce_before_shop_loop_item_title', 'display_products_loop_out_of_stock' );
function display_products_loop_out_of_stock() {
global $product;
if ( ( ! $product->is_type('variable') && ! $product->is_in_stock() )
|| ( $product->is_type('variable') && is_variable_product_out_of_stock( $product ) ) ) {
echo '<span class="soldout">Sold Out</span>';
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。它应该有效。
我制作了@LoicTheAztec 的函数的轻量级版本,它会在找到库存变量后立即停止循环:
function is_variable_product_out_of_stock($product) {
$variation_ids = $product->get_visible_children();
foreach($variation_ids as $variation_id) {
$variation = wc_get_product($variation_id);
if ($variation->is_in_stock())
return false;
}
return true;
}
也没有致命错误,因为他在函数中犯了两个严重的错别字。
你可以像他一样做一些定制的事情:
add_action('woocommerce_before_shop_loop_item_title', 'display_products_loop_out_of_stock');
function display_products_loop_out_of_stock() {
global $product;
if ((!$product->is_type('variable') and !$product->is_in_stock()) or ($product->is_type('variable') and is_variable_product_out_of_stock($product)))
echo '<span class="soldout">Sold Out</span>';
}
在 WooCommerce 中,我使用下面的功能,如果产品缺货,它会在产品缩略图上添加售罄文本:
add_action( 'woocommerce_before_shop_loop_item_title', 'bbloomer_display_sold_out_loop_woocommerce' );
function bbloomer_display_sold_out_loop_woocommerce() {
global $product;
if ( ! $product->is_in_stock() ) {
echo '<span class="soldout">Sold Out</span>';
}
}
它适用于简单产品,但不适用于可变产品。
对于有变体的可变产品,如果我将除 1 个变体之外的所有变体都设置为 0 库存数量,我注意到缩略图上仍然显示售罄消息。从技术上讲,这是不正确的,因为我们确实有一些库存。
有人知道如何更改下面的代码来处理这个问题吗?
您可以创建自定义条件函数来检查可变产品的所有变体是否都“缺货”,如下所示:
function is_variable_product_out_of_stock( $product ) {
$children_count = 0; // initializing
$variation_ids = $product->get_visible_children();
// Loop through children variations of the parent variable product
foreach( $variation_ids as $variation_id ) {{
$variation = wc_get_product($_variation_id); // Get the product variation Object
if( ! $variation->is_in_stock() ) {
$children_count++; // count out of stock children
}
}
// Compare counts and return a boolean
return count($variation_ids) == $children_count ? true : false;
}
然后您将在下面重新访问的挂钩函数中使用它:
add_action( 'woocommerce_before_shop_loop_item_title', 'display_products_loop_out_of_stock' );
function display_products_loop_out_of_stock() {
global $product;
if ( ( ! $product->is_type('variable') && ! $product->is_in_stock() )
|| ( $product->is_type('variable') && is_variable_product_out_of_stock( $product ) ) ) {
echo '<span class="soldout">Sold Out</span>';
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。它应该有效。
我制作了@LoicTheAztec 的函数的轻量级版本,它会在找到库存变量后立即停止循环:
function is_variable_product_out_of_stock($product) {
$variation_ids = $product->get_visible_children();
foreach($variation_ids as $variation_id) {
$variation = wc_get_product($variation_id);
if ($variation->is_in_stock())
return false;
}
return true;
}
也没有致命错误,因为他在函数中犯了两个严重的错别字。
你可以像他一样做一些定制的事情:
add_action('woocommerce_before_shop_loop_item_title', 'display_products_loop_out_of_stock');
function display_products_loop_out_of_stock() {
global $product;
if ((!$product->is_type('variable') and !$product->is_in_stock()) or ($product->is_type('variable') and is_variable_product_out_of_stock($product)))
echo '<span class="soldout">Sold Out</span>';
}