我正在尝试创建一个 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 列表中,但运行它没有执行任何操作。
如有任何建议,我们将不胜感激!
您的代码中有很多错误:
$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'
参数中微调要加工的产品数量,如果要加工的产品太多,可能会导致预定的活动崩溃甚至网站崩溃。
相关: