我尝试创建一个每小时运行一次的定时cron作业,这是我第一次使用wp cron。
在cron函数中,如果满足某些条件,我想更新post meta值。
我还在cron外部测试了cron函数的代码,以查看/打印结果。结果看起来不错,但当cronjob运行时,不会更新任何帖子。
Iam使用WP Crontrol查看所有可用的cronjobs。
首先,我安排一个活动(这似乎有效):
function prfx_hourly_status_update_cron_job() {
if ( ! wp_next_scheduled( \'prfx_run_hourly_status_update_cron_job\' ) ) {
wp_schedule_event( current_time( \'timestamp\' ), \'hourly\', \'prfx_run_hourly_status_update_cron_job\' );
}
}
add_action( \'wp\', \'prfx_hourly_status_update_cron_job\' );
创建此事件后,我尝试运行此函数。
我得到的所有帖子都有一个元字段,其中的值不是空的
此字段是日期。(Y-m-d)
对于每个帖子/产品I,得到两个meta值<截止日期和更早的截止日期
我将今天的日期与这些保存的日期进行比较,并希望在此基础上更新另一个元值。
function prfx_run_hourly_status_update_cron_job( ) {
// create meta query to get all posts which have a deadline date (field not empty)
$args = array(
\'posts_per_page\' => -1,
\'meta_query\' => array(
array(
\'key\' => \'_prfx_custom_product_deadline\',
\'value\' => \'\',
\'compare\' => \'!=\'
),
),
\'post_type\' => \'product\',
\'no_found_rows\' => true, //speeds up a query significantly and can be set to \'true\' if we don\'t use pagination
\'fields\' => \'ids\', //again, for performance
);
$posts_array = get_posts( $args );
// start if we have posts
if ($posts_array) {
// get todays date in Y-m-d format
$today = date(\'Y-m-d\');
//now check conditions and update the code
foreach( $posts_array as $post_id ){
$saved_deadline = get_post_meta( $post_id, \'_prfx_custom_product_deadline\', true ); // get deadline-date
$soon_deadline = get_post_meta( $post_id, \'_prfx_custom_product_deadline_soon\', true );// get deadline-soon-date
if ($today > $saved_deadline) { // if today is after deadline
update_post_meta( $post_id, \'_prfx_custom_product_status\', \'deadline-met\' );
} elseif ($today < $saved_deadline && $today > $soon_deadline) { // if today is before deadline but after soon-deadline
update_post_meta( $post_id, \'_prfx_custom_product_status\', \'deadline-soon\' );
}
}
}
}
如上所述,我尝试运行这个函数,而不是update\\u post\\u meta,我只是将数据打印出来。这似乎奏效了。Iam还使用类似的函数在前端回显一些字符串,因此日期比较也可以工作。
更新:所以,我无法将此用于cronjobs。我刚刚在插件中测试了以下代码,当我激活插件时,代码就会运行。查询工作正常,我打印/检查了结果,它就像简单的插件代码一样工作。
但cronjob中没有运行相同的代码。当我使用Wp Crontrol查看cron输出时,可以看到每小时事件“prfx\\u run\\u hourly\\u status\\u update\\u cron\\u job”,但没有分配任何操作。然而,例如“woocommerce\\u geoip\\u updater”也没有列出任何操作<也许有人知道为什么?
以下是测试代码:
add_action(\'init\',\'prfx_resave_posts\');
function prfx_resave_posts(){
$args = array(
\'posts_per_page\' => -1,
\'post_type\' => \'product\',
\'meta_query\' => array(
array(
\'key\' => \'_prfx_custom_product_deadline_soon\',
\'value\' => \'\',
\'compare\' => \'!=\'
),
),
\'no_found_rows\' => true, //speeds up a query significantly and can be set to \'true\' if we don\'t use pagination
\'fields\' => \'ids\', //again, for performance
);
$posts_array = get_posts( $args );
if ($posts_array) { //output: Array ( [0] => 120399 [1] => 120431 [2] => 120469 [3] => 120401 [4] => 120433 )
// get todays date in Y-m-d format
$today = date(\'Y-m-d\');
foreach ($posts_array as $my_post) {
#print_r($my_post);
//output example: 120399
$saved_soon_deadline = get_post_meta( $my_post, \'_prfx_custom_product_deadline_soon\', true );
#print_r($saved_soon_deadline);
//output: 2018-11-30
if ($today > $saved_soon_deadline) {
update_post_meta( $my_post, \'_prfx_custom_product_status\', \'my-new-val-here\' );
}
}
}
}
SO网友:LWS-Mo
我不知道这里到底发生了什么,但我找到了解决办法
我在最初的问题中发布的代码位于一个插件中,其中包含其他几个函数和代码
刚才,我只为我想使用的每小时cronjob创建了一个单独的插件
在插件激活时,我添加新的cronjob,在停用时,该作业将被删除<但是无论如何,更新帖子元的代码仍然与我发布的代码相同。所以我不知道为什么它在一个单独的插件文件中工作。也许安排这些活动有什么不对?
register_activation_hook( __FILE__, \'prfx_add_cronjob_on_activation\' );
function prfx_add_cronjob_on_activation() {
wp_schedule_event( time(), \'hourly\', \'prfx_update_status_job\' );
}
register_deactivation_hook( __FILE__, \'prfx_delete_cronjob_on_deactivation\' );
function prfx_delete_cronjob_on_deactivation() {
wp_clear_scheduled_hook( \'prfx_update_status_job\' );
}
add_action( \'prfx_update_status_job\', \'prfx_update_status_code\' );
function prfx_update_status_code(){
$args = array(
\'posts_per_page\' => -1,
\'post_type\' => \'product\',
\'meta_query\' => array(
array(
\'key\' => \'_prfx_custom_product_deadline\',
\'value\' => \'\',
\'compare\' => \'!=\'
),
),
\'no_found_rows\' => true, //speeds up a query significantly and can be set to \'true\' if we don\'t use pagination
\'fields\' => \'ids\', //again, for performance
);
$posts_array = get_posts( $args );
if ($posts_array) {
// get todays date in Y-m-d format
$today = date(\'Y-m-d\');
foreach ($posts_array as $single) {
$saved_deadline = get_post_meta( $single, \'_prfx_custom_product_deadline\', true );
$soon_deadline = get_post_meta( $single, \'_prfx_custom_product_deadline_soon\', true );
if ($today > $saved_deadline) {
update_post_meta( $single, \'_prfx_custom_product_status\', \'deadline-met\' );
} else {
if ($soon_deadline && $today > $soon_deadline) {
update_post_meta( $single, \'_prfx_custom_product_status\', \'deadline-soon\' );
}
}
}
}
}