您可以通过cron_schedules创建新的时间表时间:
function my_cron_schedules($schedules){
if(!isset($schedules["5min"])){
$schedules["5min"] = array(
'interval' => 5*60,
'display' => __('Once every 5 minutes'));
}
if(!isset($schedules["30min"])){
$schedules["30min"] = array(
'interval' => 30*60,
'display' => __('Once every 30 minutes'));
}
return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');
现在,您可以安排功能了:
wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
要只调度一次,请将其包装在函数中并在运行前进行检查:
$args = array(false);
function schedule_my_cron(){
wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
}
if(!wp_next_scheduled('my_schedule_hook',$args)){
add_action('init', 'schedule_my_cron');
}
注意$ args参数!在wp_next_scheduled中未指定$ args参数,而在wp_schedule_event中具有$ args将导致几乎相同数量的同一事件被调度(而不是一个)。
最后,创建您要运行的实际功能:
function my_schedule_hook(){
// codes go here
}
我认为必须要提到的是,wp-cron在每次加载页面时都会检查计划并运行适当的计划作业。
因此,如果您的网站访问量低,每小时只有1个访客,则wp-cron仅在该访客浏览您的网站时运行(一个小时)。如果您的网站访问量很高,访问者每秒请求一个页面,那么将每秒触发一次wp-cron,这会导致服务器上的额外负载。
解决方案是在最快重复计划的wp-cron作业(在您的情况下为5分钟)的时间间隔内,停用wp-cron并通过真实的cron作业触发它。
卢卡斯·罗尔夫(Lucas Rolff)解释了问题,并提供了详细的解决方案。
或者,如果您不想停用wp-cron并通过真正的cron作业触发它,则可以每5分钟使用免费的第三方服务(如UptimeRobot)来查询您的网站(并触发wp-cron)。