WP cron and update post meta

时间:2018-10-19 作者:LWS-Mo

我尝试创建一个每小时运行一次的定时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\' );
            }

        }
    }

}

2 个回复
SO网友:Pim

您所做的是在post对象数组上循环。

这个get_posts() 函数返回对象,而不是ID。

所以你要做的是

$post_id->ID

setup_postdata( $post_id ) 然后使用get_the_ID().

可能要重命名$post_id$post_object 以避免混淆。

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\' );
                }
            }
        }
    }
}

结束

相关推荐

Wordpress wp-cron not working

Cron未按预期工作。如果我安排帖子或事件管理器事件,如果在发布时间之后访问站点,则不会发布。如果我去http://somedomain.tld/wp-cron.php?doing_wp_cron 它为空,而调试设置为打开。它应该是空的还是应该显示一些错误(如果有)?错误日志为空。WP Crontrol插件显示cron作业。有没有提示下一步要检查什么?