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

在我的 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 可变产品?


HUX布斯
浏览 79回答 1
1回答

桃花长相依

注意:从 WooCommerce 3 和 4 开始,最好使用WC_Product 可用的方法,因为有新的自定义表和缓存数据需要更新。有一种方法可以显示或隐藏产品目录中的可变产品(有点复杂)。1)。一个轻量级条件函数,用于检查可变产品的所有产品变体是否“缺货”:// Conditional function to check if a variable product has at least a variation in stockfunction 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 文件中。下面需要这个函数,所以保留它。2)。一个自定义函数,将检查所有可变产品(及其所有变体库存),添加自定义元数据(此函数将仅使用一次,然后删除)。// Function that will check the variations stock for each variable products adding custom meta datafunction 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 sitecheck_and_update_all_variable_products();代码位于活动子主题(或活动主题)的 function.php 文件中。保存后,浏览您网站的任何页面即可运行此功能。然后将其删除。3)。现在,一个钩子函数将隐藏您的变量产品,这些产品的变体都是“缺货”,来自 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 pagesadd_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 datafunction 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 pagesadd_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 dataupdate_parent_variable_product_stock_custom_meta( $product );
打开App,查看更多内容
随时随地看视频慕课网APP