在特定的本地时间运行WP Cron

时间:2013-01-24 作者:Ivan Slaughter

场景是在当地时间每午夜(00:00)运行insert\\u post函数。必须在工作日每天运行。

function add_daily_task(){
    if((date(\'l\', time()) != \'Saturday\') || (date(\'l\', time()) != \'Sunday\')){ 
        // insert post
    }
}

if(!wp_next_scheduled( \'add_daily_task_schedule\')){
    wp_schedule_event(time(), \'daily\', \'add_daily_task_schedule\');
    // how should change time() to meet my local schedule?
}

add_action(\'add_daily_task_schedule\', \'add_daily_task\'); 

4 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

不确定问题是什么,但time() 是错误的,因为它最多只能提供服务器的本地时间,而不是考虑WordPress时区配置的站点的本地时间。

您应该使用的函数是current_time.

SO网友:Matt Keys

wp\\U schedule\\u事件无法用于您正在尝试的精确时间测量。使用wp\\u schedule\\u event计划的事件很少在计划运行时准确运行,它在为其配置的时间之后的某个时间运行。

要理解这一点,您必须了解php直到您要求它查看时才知道现在是什么时候。每当有人访问你的网站时,Wordpress都会检查时间。然后将当前时间与任何计划任务的时间进行比较。如果时间等于或大于(晚于)计划时间,它将运行任务。

因此,这意味着,即使您解决了时间安排问题,您的任务也不会运行,直到您选择的时间已经过去,并且有人加载了您的网站。

综上所述,如果您仍然想尝试并实现这一目标,这里有一个可能的解决方案。为函数添加新间隔。php

function cron_add_weekly( $schedules ) {
    // Adds once weekly to the existing schedules.
    $schedules[\'weekly\'] = array(
            \'interval\' => 604800,
            \'display\' => __( \'Once Weekly\' )
    );
    return $schedules;
}
将功能更改为wp_schedule_event(time(), \'weekly\', \'add_daily_task_schedule\');

如果您在下周六午夜将此计划落实到位,Wordpress将尝试每周在同一时间运行此计划(假设有人访问您的站点触发此计划)。

SO网友:Tyler

首先,确保WordPress date and time settings 与您的本地服务器时间一样正确。

然后使用以下代码:

$datetime = new DateTime(\'midnight\', new DateTimeZone(get_option(\'timezone_string\'))); 
$datetime->setTimezone(new DateTimeZone(\'UTC\')); 
$timestamp = $datetime->getTimestamp();

wp_schedule_event($timestamp, \'daily\', \'your_action_hook_name\');
您可以修改\'midnight\'\'tomorrow 3am\' 或者任何适合你需要的东西。

如果您需要仅在工作日运行任务(插入帖子或其他内容),则可以在挂钩函数中实现该逻辑。

请参阅wp_schedule_event() code reference 对于重复选项,例如。\'hourly\', \'daily\', \'twicedaily\', \'weekly\'. 这些都是内置选项,您不需要使用cron_schedules filter.

这个WP Crontrol 插件对于确保正确设置cron事件非常有用。

SO网友:birgire

功能:

time()
给出GMT时区中的UNIX时间戳。

因此,如果您是GMT+2,您可以使用:

time() + 2*60*60;
或者,如果您是GMT-4,您可以使用:

time() - 4*60*60;
尝试在代码中用mytime()替换time(),其中:

function mytime(){
    $gmt_offset_in_hours=-2; // for GMT-2 (EDIT this value) 
    return time() + $gmt_offset_in_hours*60*60;     
}

结束

相关推荐

如何确保wp-cron作业运行

我正在使用一个插件向一个相对较大的电子邮件列表发送电子邮件。因为我们的主机每小时发送电子邮件的阈值很低,所以我们必须使用插件中的设置,将电子邮件限制在每小时只有一定数量。我假设插件使用wp cron来实现这一点。我曾尝试在wp-cron上查找文档,但我能找到的唯一重要信息是它需要一个页面视图才能运行。问题:RSS提要是否被ping到足以触发“页面视图”,从而触发wp cron</wp cron将在页面视图后运行多长时间?(例如,如果最后一次查看页面是在下午6:59,cron是否会安排在晚上7点运行?