Woocommerce - 创建自定义 cron 作业以根据日期比较更新库存状态

问题描述 投票:0回答:1

我正在尝试创建一个 cron 作业,它将比较设置为产品元数据的日期与当前日期,然后在设置为产品元数据的日期已过时更新产品库存。

这是我到目前为止所拥有的,但它不起作用:

// Custom CRON Function
function update_pre_order_stock_status($post_id){

        $current_date = date( 'YYYY-mm-dd' );
        $expiryDate = $product->get_meta('woo_expiry_date');
        $woo_expiry_action = $product->get_meta('woo_expiry_action');
        $product_category = array( 'comic-book-pre-orders', 'dc-comics-pre-orders', 'image-comics-pre-orders', 'manga-pre-orders', 'marvel-comics-pre-orders', 'other-publisher-pre-orders');
    
        if(( is_product_category( $product_category )) && ( $expiryDate <= $current_date ) && ( $woo_expiry_action == 'out' )) {
            
            // 1. Updating the stock quantity
            update_post_meta( $post_id, '_stock', 0);

            // 2. Updating the stock quantity
            update_post_meta( $post_id, '_stock_status', wc_clean( 'outofstock' ) );

            // 3. Updating post term relationship
            wp_set_post_terms( $post_id, 'outofstock', 'product_visibility', true );
        }
}

if ( ! wp_next_scheduled( 'my_pre_order_stock_update' ) ) {
    wp_schedule_event( time(), 'hourly', 'my_pre_order_stock_update' );
}

add_action( 'my_pre_order_stock_update', 'update_pre_order_stock_status' );

Cron 事件“my_pre_order_stock_update”显示在 cron 列表中,但运行它没有执行任何操作。

如有任何建议,我们将不胜感激!

woocommerce cron
1个回答
0
投票

您的代码中有很多错误:

  • 变量
    $post_id
    未定义,因为您没有将任何帖子 ID 参数传递给
    wp_next_scheduled
    wp_schedule_event
    函数。
  • 变量
    $product
    也未定义(并且实际上无法定义)。

我假设您正在尝试根据以下内容更新某些特定产品:

  • 他们根据术语列表分配的产品类别
  • woo_expiry_date
  • 中的日期自定义元数据
  • woo_expiry_action
  • 中的值自定义元数据

因此您需要通过

WP_Query
获取这些产品ID,这是最简单的方法。

现在,由于 WooCommerce 从版本 3 开始迁移到自定义表,并且缓存了一些产品数据,因此您不应再使用 WordPress 帖子元函数。

尝试以下方法(未经测试):

// Custom Cron hooked Function called by wp_schedule_event
add_action( 'jape_pre_order_stock_update', 'update_pre_order_stock_status' );
function update_pre_order_stock_status(){
    // Get all related product IDs to update via a WP_Query
    $products_ids = get_posts( [
        'post_type'   => 'product',
        'post_status' => 'publish',
        'numberposts' => -1, // <= the number of products to process (-1 is all)
        'fields'      => 'ids',
        'tax_query' => array( array(
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => array(
                'comic-book-pre-orders',
                'dc-comics-pre-orders',
                'image-comics-pre-orders',
                'manga-pre-orders',
                'marvel-comics-pre-orders',
                'other-publisher-pre-orders',
            ),
        ) ),
        'meta_query' => array( 
            'relation' => 'AND',
            array(
                'key'     => 'woo_expiry_date',
                'value'   => date('YYYY-mm-dd'),
                'compare' => '<=',
            ),
            array(
                'key'     => 'woo_expiry_action',
                'value'   => 'out',
                'compare' => '=',
            ),
        ),
    ] );

    foreach( $products_ids as $product_id ) {
        $product = wc_get_product($product_id);

        $product->set_stock_quantity(0); // Set stock quantity
        $product->set_stock_status('outofstock'); // Set stock status
        $product->save(); // Save updated product data
    }
}

// Cron schedule event function
function cron_starter_hourly_products_update() {
    if ( ! wp_next_scheduled( 'jape_pre_order_stock_update' ) ) {
        wp_schedule_event( time(), 'hourly', 'jape_pre_order_stock_update' );
    }
}

cron_starter_hourly_products_update(); // Initiate cron schedule event

代码位于子主题的functions.php 文件中(或插件中)。它可以工作。

注意:需要在

'numberposts'
参数中微调要加工的产品数量,如果要加工的产品太多,可能会导致预定的活动崩溃甚至网站崩溃。

相关:

© www.soinside.com 2019 - 2024. All rights reserved.