每天特定时间的WP_Schedule_Event()

时间:2016-04-11 作者:Mayeenul Islam

我对WP-Cron不太熟悉,但我在我的一个网站上使用了它们。我为每小时设置一个自定义查询:

add_action( \'init\', function () {
    if( ! wp_next_scheduled( \'expire_cpt\' ) ) {
        wp_schedule_event( time(), \'hourly\', \'expire_cpt\' );
    }
    add_action( \'expire_cpt\', \'pre_expire_the_offers\' );
});
function pre_expire_the_offers() {
 //...
}
现在我们的功能程序改变了,我们想制定一个每日时间表。所以我这样安排:

add_action( \'init\', function () {

    //Used once to delete all the schedule
    //wp_clear_scheduled_hook(\'expire_cpt\');

    //I assumed, by clearing, I no-longer need this
    //$timestamp = wp_next_scheduled( \'expire_cpt\' );
    //wp_unschedule_event( $timestamp, \'expire_cpt\' );

    if( ! wp_next_scheduled( \'expire_cpt\' ) ) {
        //Need to run this at 24:00:00 everyday, not 24 hours from now
        wp_schedule_event( time(\'00:00:00\'), \'daily\', \'expire_cpt\' );
    }
    add_action( \'expire_cpt\', \'pre_expire_the_offers\' );
});
我正在Windows机器的本地WAMP服务器上执行此操作。我的本地电脑时间echo date( \'Y-m-d H:i:s\', current_time( \'timestamp\' ) ), is 2016-04-11 17:18:58。

六个小时的时差可以是格林尼治标准时间和我的时区(+6)-这是合理的。

但问题在于下一个预定时间。

我正在使用:

1 个回复
最合适的回答,由SO网友:Rarst 整理而成

time() 只返回当前时间,不接受任何输入。

$time = time(); // works out to 2016-04-11T12:11:34+00:00
你想要的是明天午夜:

$tomorrow = strtotime( \'tomorrow\' ); // works out to 2016-04-12T00:00:00+00:00
请注意,这些是PHP函数,它们忽略了WP时区,因为它会将PHP时区重置为UTC。因此,如果使用这些,则将其设置为UTC时区的午夜。

在WP中正确使用它是一个混乱的过程(在某些没有timezone_string 设置,请参见my post on DateTime in WP 有关更多详细信息):

$date = new DateTime( \'tomorrow\', new DateTimeZone( get_option( \'timezone_string\' ) ) );
// works out to 2016-04-12T00:00:00+03:00
$timestamp = $date->getTimestamp();
Note: WP Cron不能保证在精确的时间运行,因为它是通过访问站点触发的。我不确定是否经常性跑步会在午夜“粘住”或从那里慢慢滑落,你可能需要定期重新调整。