wp_schedule_event didn't work

时间:2017-01-20 作者:John

如果我给出具体的帖子id,它会起作用。如果我给出$post->id,它不会起作用。为什么?

这里是我的代码:

add_action( \'wp\', \'delete_expired_coupons_daily\' );
function delete_expired_coupons_daily() {
    if ( ! wp_next_scheduled( \'update_expired_post_status\' ) ) {
        wp_schedule_event( time(), \'hourly\', \'update_expired_post_status\');
    }
}
function update_expired_field(){     
 global $post;
 $postid=$post->ID;
              $my_post = array(
                             \'ID\'           => $postid,
                             \'post_status\'   => \'expired\',
                         );
              wp_update_post( $my_post );

}
add_action( \'update_expired_post_status\', \'update_expired_field\', 10);

1 个回复
SO网友:Dani Llewellyn

Cron在标准WordPress循环之外激发,因此$post 调用函数时,将不会填充任何与post相关的数据。显然,直接提供ID并不是引用不存在的ID$post 变量,这就是它在该场景中工作的原因。

将post\\u status设置为expired的最佳方法是使用WP\\u Query将您的函数更改为加载需要过期的帖子并在其中循环的函数:

function update_expired_field() {
    $today = getdate();
    $query = new WP_Query( \'meta_query\' => array(
            \'key\'     => \'your_expire_meta_key\',
            \'value\'   => $today[\'year\'] . \'-\' . $today[\'month\'] . \'-\' . $today[\'mday\'],
            \'type\'    => \'DATE\',
            \'compare\' => \'<=\',
        ),
        \'fields\' => \'ids\',
    );

    foreach( $query->posts as $postid ) {
        wp_update_post( array(
            \'ID\'          => $postid,
            \'post_status\' => \'expired\',
        ) );
    }
}
在我显示的代码中,从数据库中查询meta\\u key字段,查找一个名为“your\\u expire\\u meta\\u key”的键,该键需要具有您希望帖子过期的日期的值,格式为YYYY-MM-DD。我们将该日期字段与今天的日期进行比较,以确定哪些帖子需要过期。这个\'fields\' => \'ids\' 告诉WP\\u Query只返回post ID,以便我们尽可能快地运行。最后,我们循环遍历每个帖子ID,并将相关帖子更新为过期状态。

相关推荐

未执行Cronjob函数-负秒数

我创建了一个自定义函数,用于读取XML文件并将其导入woocommerce产品。XML文件每天由外部平台在网站ftp中导出。我将wordpress cronjob替换为真正的cronjob,cronjob实际上调用了函数,但函数从未执行过(参见屏幕截图)。我的职能:<?php /** * DynamiX Child Theme Functions * Load languages directory for translation */ fu