计划任务,顾名思义,就是将一些将来需要做的事情交给Wordpress自动去处理,就像定时发布。有时候我们需要自定义其他的任务,比如自动清理未使用的媒体库图片,自动将注册时间超过某时段的用户升级为高阶角色。
WordPress提供了很方便的方法帮助我们来实现这些功能,该方法分为两类,一类是可重复执行的计划任务,一类是仅执行一次的计划任务。
可重复执行的计划任务
该方法首先需要一个重复的时段,系统默认提供了三个重复时段,可以通过以下方法获取:
<?php
wp_get_schedules();
?>
返回值是:
Array
(
[hourly] => Array
(
[interval] => 3600
[display] => Once Hourly
)
[twicedaily] => Array
(
[interval] => 43200
[display] => Twice Daily
)
[daily] => Array
(
[interval] => 86400
[display] => Once Daily
)
)
分别是每小时,每2天,每1天,如果你想增加自定义时间段每分钟:
<?php
add_filter('cron_schedules', 'new_interval');
function new_interval($interval) {
$interval['minutely'] = array(
'interval' => 60,
'display' => __('minutely', YOURTEXTDOMAIN)
);
return $interval;
}
?>
然后,你就可以在这个时间段上定制计划任务了:
<?php
if (!wp_next_scheduled('your_cron')) {
wp_schedule_event( time(), 'minutely', 'your_cron', array($arg1, $arg2));
}
add_action( 'your_cron', 'do_somethings', 10, 2 );
function do_somethings($arg1, $arg2) {
// 你的计划任务代码
}
?>
仅执行一次的计划任务
这个就比较简单了,只需要指定一个距离当前时间有多久的时间戳就行,比如我要指定一个距离当前时间1小时执行的计划任务:
<?php
function do_sonething($arg) {
//do something here
}
add_action( 'your_schedule', array($this, 'do_sonething') );
wp_schedule_single_event( time() + 3600, 'your_schedule', array($arg) );
?>
取消还未执行的计划任务
这个方法同时适用于重复执行和仅执行一次,只需要提供指定计划任务的下一个执行时间的时间戳及其参数(没有参数可留空):
<?php
$timestamp = wp_next_scheduled( 'your_cron', array($arg1, $arg2) );
wp_unschedule_event( $timestamp, 'your_cron', array($arg1, $arg2) );
?>
或者更野蛮一点,取消所有的该计划任务的节点,如果指定了参数,就是取消所有包含该参数的计划任务。。
<?php
wp_clear_scheduled_hook( 'your_cron', array($arg1, $arg2) );
?>
判断计划任务是否存在
有两种方法:
<?php
$schedule = wp_get_schedule( 'your_cron', array($arg1, $arg2) );
// $schedule == minutely
$schedule = wp_next_scheduled( 'your_schedule', array($arg) );
// $schedule == 194154874541
?>
如果不存在,都会返回false。