繁体   English   中英

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

[英]Hide WooCommerce variable product from catalog if all variations are out of stock

在我的 WooCommerce 商店中,有颜色变化的产品。 库存的更新处于变化级别,因为外部提要将每种颜色视为不同的产品。

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

当您单击一个变体全部缺货的产品时,它会显示:“该产品目前缺货且不可用。”。

WooCommerce 中是否有设置也可以将这些产品隐藏在我的目录中? 或者我是否必须制作一个额外的脚本来检查每个可变产品并使其最高级别缺货?

我在变量产品上尝试的代码无效:

$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 可变产品?

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

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

1)。 一个轻量级的条件 function检查变量产品是否具有“缺货”的所有产品变体:

// 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 文件中。 下面需要这个function,所以请保留。


2)。 自定义 function将检查所有可变产品(及其所有变体库存)添加自定义元数据(此 function 将只使用一次,然后删除)。

// 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 文件中。 保存后,浏览我们网站的任何页面,以运行此 function。 然后将其删除。


3)。 现在一个挂钩的 function将隐藏您的可变产品,这些产品的变体都是“缺货”,来自 WooCommerce 目录和单个产品页面:

// 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 文件中。 测试和工作。


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

// 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 文件中。 测试和工作。


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

$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 );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM