如何在当地时间戳触发WP Cron?

时间:2018-10-20 作者:Deepak Singh

我正在尝试安排WP Cron,它应该在每个午夜的本地时间戳运行,但它只使用UTC。这就是我正在尝试的代码,

if ( ! wp_next_scheduled( \'midnight_cron\' ) ) {
        $now = current_time(\'timestamp\', 1 );
        $time = strtotime(\'tomorrow\', $now );

        wp_schedule_event($time, \'daily\', \'midnight_cron\');
    }
我知道默认情况下,WP cron使用UTC/GMT时间,而不是本地时间,但实现这一点的可能方法是什么?

Update:

if ( ! wp_next_scheduled( \'midnight_cron\' ) ) {

        $gmt = get_option( \'gmt_offset\' );
        $time = strtotime(\'midnight\') + ((24 - $gmt) * HOUR_IN_SECONDS);
        if($time < time()) $time + (24 * HOUR_IN_SECONDS);

        wp_schedule_event($time, \'daily\', \'midnight_cron\');
    }

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

第1部分。时间!=时间戳

enter image description here

这是您的问题:

每午夜本地时间戳

没有本地时间戳这样的东西。时间戳没有时间分区,不是WP使用UTC,而是UTC时间戳正好是+0小时。

如果希望它发生在当地时间午夜,则需要将该时间转换为时间戳,UTC是最简单的方法。例如,英国夏令时午夜是UTC时间11点,因此我需要为11点安排一个cron作业,以便它在午夜运行。如果我将cron作业设置为在00:00运行,那么这将是当地时间凌晨1点,这不是我想要的。

因此,请获取所需的本地化时区时间,并在代码中将其转换为UTC。如果需要显示数学,您可以随时在以后撤消它。

e、 g.这里我们采用UTC日期并将其更改为莫斯科时间:

$date = new DateTime(\'2012-07-16 01:00:00 +00\');
$date->setTimezone(new DateTimeZone(\'Europe/Moscow\')); // +04

echo $date->format(\'Y-m-d H:i:s\'); // 2012-07-15 05:00:00 
这里我们使用曼谷时间并将其转换为UTC:

$given = new DateTime("2014-12-12 14:18:00 +07");
echo $given->format("Y-m-d H:i:s e") . "\\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\\n"; // 2014-12-12 07:18:00 UTC
如果您仍然希望在本地时间指定内容,只需编写一个函数来进行转换,例如:。$utc_time = convert_to_utc( "time in local timezone")

第2部分。为什么选择UTC

你有没有注意到为什么一些时区被引用为+8 小时或-2? 这将是UTC+8或UTC-2。UTC也称为协调世界时。

它是我们日常使用的所有常用时间系统的基础标准。因此,您的本地时间被定义为UTC的某个偏移量。

那么我可以让WP使用本地时区作为时间戳吗

如果WP使用本地时间存储所有内容,那么更改本地时间将涉及修改数据库中的每个时间戳。这将导致与其他API的通信出现问题。这也会导致插件和主题出现问题,这些插件和主题试图从UTC转换到您的本地时区,使偏移量加倍,并导致复合错误。它还可能导致REST API、双因素身份验证等问题

这是一个非常糟糕的主意。它还破坏了站点上时间戳的基本系统。

这样想吧。您可以在WordPress中看到带有时区修饰符的时间和日期。当WP存储数据时,它会去掉修改器,并将其存储为所有WP站点和计算机都能理解的标准值。然后,无论何时显示日期,它都会重新应用时区修饰符。

SO网友:Antti Koskinen

这个wp_schedule_event 函数具有schedule_event 内部过滤器。如果你看看wp-includes/cron.php lines 102-106 您可以看到它是如何使用的。

也许您可以将自定义函数挂接到该过滤器。在自定义筛选函数中,如果时间不正确,则可以执行一些本地时间检查并使主函数短路(,即返回false)。

我以前没有亲自测试或做过,但我刚刚想到这个想法。

结束

相关推荐

有没有办法在每次运行cron时都运行代码?

publish_post 是每当更新帖子且其新状态为“发布”时触发的操作。运行cron时是否会触发类似的操作,包括WordPress默认cron?我正在构建一个插件,记录每个cron的详细信息。像这样的cron在这个时候运行,这个cron在这个时候运行,等等。。。。。这就是为什么我需要这个。