如果所有变体都缺货,则从目录中隐藏 WooCommerce 可变产品 [英] Hide WooCommerce variable product from catalog if all variations are out of stock

查看:67
本文介绍了如果所有变体都缺货,则从目录中隐藏 WooCommerce 可变产品的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的 WooCommerce 商店中,有些产品颜色不同.库存更新是在变体级别,因为外部供稿将每种颜色视为不同的产品.

Within my WooCommerce shop, there are products with variations in color. The update on the stock is on variations level because the external feed sees every color as a different product.

现在我遇到了一个问题,即可变产品的所有变体都缺货,但产品本身仍然显示在网上商店的目录中.即使我打开了从目录中隐藏缺货商品"设置.但此设置仅适用于没有变化的产品.

Now I've got a issue where all the variations of a variable product are out of stock, but the product itself still show up in the catalog of the Webshop. Even tho I turn on the setting "Hide out of stock items from the catalog". But this setting only works for products without variations.

当您点击某个产品的变体全部缺货时,它会显示:该产品目前缺货且不可用.".

When you click on a product with variations that are all out of stock it shows: "This product is currently out of stock and unavailable.".

WooCommerce 中是否有设置也可以将这些产品隐藏在我的目录中?还是我必须编写一个额外的脚本来检查每个可变产品并使其在最高级别脱销?

Is there a setting in WooCommerce that can also hide those products in my catalog? Or do I've to make an extra script that will check every variable product and put it out of stock at its highest level?

我在一个变量产品上试过没有效果的代码:

The code that I tried on a variable product with no effect:

$out_of_stock_staus = 'outofstock';

// 1. Updating the stock quantity
update_post_meta($product_id, '_stock', 0);

// 2. Updating the stock status
update_post_meta( $product_id, '_stock_status', wc_clean( $out_of_stock_staus ) );

// 3. Updating post term product visibility
wp_set_post_terms( $product_id, $out_of_stock_staus, 'product_visibility', true ); 

如果所有变体都缺货,我如何从目录中隐藏 WooCommerce 可变产品?

How can I hide WooCommerce variable product from catalog if all variations are out of stock?

推荐答案

注意:从 WooCommerce 3 和 4 开始,最好使用 WC_Product 可用方法,因为有新的自定义表和缓存数据要更新.

Note: Since WooCommerce 3 and 4, it's better to use WC_Product available methods as there are new custom tables and cached data to update.

有一种方法可以在产品目录中显示或隐藏可变产品(有点复杂).

1).轻量级条件函数,用于检查可变产品是否具有所有产品变体缺货":

There is a way to show or hide variable products from product catalog (a bit complex).

1). A lightweight conditional function to check if a variable product has all it's product variations "out of stock":

// Conditional function to check if a variable product has at least a variation in stock
function is_wc_variable_product_in_stock( $product_id ){
    global $wpdb;

    $count = $wpdb->get_var( $wpdb->prepare( "
        SELECT COUNT(ID)
        FROM {$wpdb->posts} p
        INNER JOIN {$wpdb->postmeta} pm
            ON p.ID           =  pm.post_id
        WHERE p.post_type     =  'product_variation'
            AND p.post_status =  'publish'
            AND p.post_parent =  %d
            AND pm.meta_key   =  '_stock_status'
            AND pm.meta_value != 'outofstock'
    ", $product_id ) );

    return $count > 0 ? true : false;
}

代码位于您的活动子主题(或活动主题)的 function.php 文件中. 以下需要此函数,因此请保留它.

Code goes in function.php file of your active child theme (or active theme). This function is needed for the following, so keep it.

2).自定义函数,用于检查您的所有可变产品(及其所有变体库存)并添加自定义元数据(此函数将仅使用一次,然后删除).

2). A custom function that will check for all your variable products (and all their variations stock) adding custom meta data (This function will be used just once and then removed).

// Function that will check the variations stock for each variable products adding custom meta data
function check_and_update_all_variable_products(){
    // Only for admins
    if( ! current_user_can('edit_products')) return;

    // get all variable product Ids
    $variable_products_ids = wc_get_products( array(
        'limit'  => -1,
        'status' => 'publish',
        'type'   => 'variable',
        'return' => 'ids',
    ));

    // Loop through variable products
    foreach( $variable_products_ids as $variable_id ) {
        // Check if all the product variations are "out of stock" or not
        $value      = is_wc_variable_product_in_stock( $variable_id ) ? '0' : '1';

        $meta_value = (string) get_post_meta( $variable_id, '_all_variations_outofstock', true );

        if ( $value !== $meta_value ) {
            // Create/Udpate custom meta data
            update_post_meta( $variable_id, '_all_variations_outofstock', $value );
        }
    }
}
// Run the function: browse any page of your web site
check_and_update_all_variable_products();

代码位于您的活动子主题(或活动主题)的 function.php 文件中. 保存后,将我们网站的任何页面变成棕色,以运行此功能.然后删除它.

Code goes in function.php file of your active child theme (or active theme). Once saved, brownse any page of your we site, to run this function. Then remove it afterwards.

3).现在是一个挂钩功能,它将隐藏您的可变产品,这些产品的变体都缺货",来自 WooCommerce 目录和单个产品页面:

3). Now a hooked function that will hide your variable products which variations are all "out of stock", from WooCommerce catalog and from single product pages:

// Hide product variations which variations are all "out of stock"
add_action( 'woocommerce_product_query', 'hide_variable_products_with_all_outofstock_variations', 10, 2 );
function hide_variable_products_with_all_outofstock_variations( $q, $query ) {
    // Get any existing meta query
    $meta_query = $q->get( 'meta_query');

    // Define an additional meta query
    $meta_query['relation'] = 'OR';
    $meta_query[] = array(
        'key'     => '_all_variations_outofstock',
        'value'   => '1',
        'compare' => '!=',
    );
    $meta_query[] = array(
        'key'     => '_all_variations_outofstock',
        'compare' => 'NOT EXISTS',
    );

    // Set the new merged meta query
    $q->set( 'meta_query', $meta_query );
}

// Hide "Out of stock" variable product single pages
add_action( 'template_redirect', 'hide_out_of_stock_variable_product_single_pages' );
function hide_out_of_stock_variable_product_single_pages(){
    if( get_post_meta( get_the_id(), '_all_variations_outofstock', true ) ) {
        // Redirect to Shop page
        wp_redirect( wc_get_page_permalink( 'shop' ) );
        exit();
    }
}

代码位于活动子主题(或活动主题)的 function.php 文件中.经测试有效.

Code goes in function.php file of your active child theme (or active theme). tested and works.

4).添加/更新产品变体库存自定义元数据:在管理单个产品页面上,检查可变产品库存状态并更新自定义元数据(以及在付费订单更新产品库存时):

4). Add / Update product variation stock custom meta: On admin single product pages, check variable product stock status and update custom meta data (and also when a paid order update the product stock):

// Custom function that update the parent variable product stock custom meta data
function update_parent_variable_product_stock_custom_meta( $product_var ) {
    if( ! is_a($product_var, 'WC_Product') ) {
        $product = wc_get_product( $product_var );
    } else { $product = $product_var; }

    if ( $product->is_type('variation') ) {
        // Get the parent product id from product variation
        $product_id = (int) $product->get_parent_id();
    } elseif ( $product->is_type('variable') ) {
        $product_id = (int) $product->get_id();
    } else {
        return; // Exit
    }

    // Check if all the product variations are "out of stock" or not
    $value = is_wc_variable_product_in_stock( $product_id ) ? '0' : '1';

    // add/Udpate custom meta data
    update_post_meta( $variable_id, '_all_variations_outofstock', $value );
}

// Update variable product stock custom meta data on admin single product pages
add_action( 'woocommerce_process_product_meta_variable', 'update_variable_product_stock_custom_meta_data' );
function update_product_variable_stock_custom_meta_data ( $product_id ) {
    update_parent_variable_product_stock_custom_meta( $product_id );
}

// On processed update product stock event (Like on orders)
add_action( 'woocommerce_updated_product_stock', 'wc_updated_product_stock_callback' );
function wc_updated_product_stock_callback ( $product_id ) {
    update_parent_variable_product_stock_custom_meta( $product_id );
}

代码位于活动子主题(或活动主题)的 function.php 文件中.经测试有效.

Code goes in function.php file of your active child theme (or active theme). tested and works.

5).以编程方式更改产品库存状态并添加/更新产品变体库存自定义元(您重新访问的代码,但用于产品变体甚至简单产品):

5). Change a product stock status programmatically and add/update product variation stock custom meta (your revisited code, but for product variations or even simple products):

$stock_status = 'outofstock';

// Get an instance of WC_Product Object from the product ID (product variation)
$product = wc_get_product( $product_id );

// 1. Updating the stock quantity
$product->set_stock_quantity(0);

// 2. Updating the stock status (and "product_visibility" related term )
$product->set_stock_status($stock_status);

// 3. Save product data and refresh cached data
$product->save();

// Update parent variable product stock custom meta data
update_parent_variable_product_stock_custom_meta( $product );

这篇关于如果所有变体都缺货,则从目录中隐藏 WooCommerce 可变产品的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆