如何在 WooCommerce 商店页面上“缺货”10 天后隐藏缺货产品

时间:2021-06-15 12:24:08

标签: php wordpress woocommerce product stock

我正在尝试开发一个片段,以便在产品售罄 10 天后隐藏缺货产品。

我正在尝试开发一个片段来隐藏 10 天售罄后缺货的产品。

为此,我的灵感来自:

我必须构建一个自定义函数来检查缺货日期。但我没有找到任何存储产品被标记为售罄的日期和时间的值或属性。

是否有现成可用的东西,或者我是否必须先创建一个片段来存储产品被标记为售罄的日期和时间,并使用该信息和 IF 语句来隐藏产品或不基于中间的日子。

add_action('woocommerce_product_query', 'custom_woocommerce_product_query');

function custom_woocommerce_product_query($q)
    {
       if ( out_of_stock < 10 ())
           {
            $oos_query = new WP_Query(['meta_query' => [['key' => '_stock_status', 'value' => 'outofstock', 'compare' => '=', ], ], 'post_type' => 'product', 'posts_per_page' => - 1, 'fields' => 'ids', ]);
            $exclude_ids = $oos_query->posts;
    
            $q->set('post__not_in', $exclude_ids);
        }
    }

开箱即用的“无货”通知挂钩

add_filter( 'woocommerce_email_recipient_no_stock', 'change_stock_email_recipient', 10, 2 ); // For No stock notification

如果有人能指出我正确的方向,我会很高兴

1 个答案:

答案 0 :(得分:1)

这将隐藏 10 天后缺货的产品。

  • 库存变化事件后,当产品没有库存时触发woocommerce_no_stock动作挂钩
  • 当您通过产品编辑设置在 WooCommerce 后端调整库存时,$meta_value 将通过 woocommerce_admin_process_product_object 操作挂钩重置
  • 通过 woocommerce_product_query 操作挂钩更改商店查询

通过添加到我的答案中的评论标签的解释:

// After stock change events, when the product is without stock
function action_woocommerce_no_stock( $wc_get_product ) {
    // Retrieves the date, in localized format.
    $date = wp_date( 'Y-m-d' );
    
    // Update meta
    $wc_get_product->update_meta_data( '_no_stock_date', $date );

    // Save
    $wc_get_product->save();
}
add_action( 'woocommerce_no_stock', 'action_woocommerce_no_stock', 10, 1 );

// When product is saved in WooCommerce backend
function action_woocommerce_admin_process_product_object( $product ) {
    // Get stock quantity
    $stock_quantity = $product->get_stock_quantity();
    
    // Greater than or equal to
    if ( $stock_quantity >= 1 ) {
        // Get meta value
        $no_stock_date = $product->get_meta( '_no_stock_date' );

        // NOT empty
        if ( ! empty ( $no_stock_date ) ) {
            // Update
            $product->update_meta_data( '_no_stock_date', '' );
        }
    }
}
add_action( 'woocommerce_admin_process_product_object', 'action_woocommerce_admin_process_product_object', 10, 1 ); 

// Change the shop query
function action_woocommerce_product_query( $q, $query ) {
    // Returns true when on the product archive page (shop).
    if ( is_shop() ) {
        // Retrieves the date, in localized format.
        $date = wp_date( 'Y-m-d' );
        
        // Date - 10 days
        $date = wp_date( 'Y-m-d', strtotime( $date . ' -10 days' ) );
        
        // Get any existing meta query
        $meta_query = $q->get( 'meta_query' );
        
        // Define an additional meta query 
        $meta_query[] = array(
            'relation'    => 'OR',
            array(
                'key'     => '_no_stock_date',
                'value'   => $date,
                'compare' => '>',
                'type'    => 'date',
            ),
            array(
                'key'     => '_no_stock_date',
                'compare' => 'NOT EXISTS',
                'type'    => 'date',
            )
        );

        // Set the new merged meta query
        $q->set( 'meta_query', $meta_query );
    }
}
add_action( 'woocommerce_product_query', 'action_woocommerce_product_query', 10, 2 );