计划任务,顾名思义,就是将一些将来需要做的事情交给Wordpress自动去处理,就像定时发布。有时候我们需要自定义其他的任务,比如自动清理未使用的媒体库图片,自动将注册时间超过某时段的用户升级为高阶角色。

WordPress提供了很方便的方法帮助我们来实现这些功能,该方法分为两类,一类是可重复执行的计划任务,一类是仅执行一次的计划任务

可重复执行的计划任务

该方法首先需要一个重复的时段,系统默认提供了三个重复时段,可以通过以下方法获取:

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天,如果你想增加自定义时间段每分钟:

add_filter('cron_schedules', 'new_interval');
function new_interval($interval) {
	$interval['minutely'] = array(
		'interval' => 60,
		'display' => __('minutely', YOURTEXTDOMAIN)
	);
	return $interval;
}

然后,你就可以在这个时间段上定制计划任务了:

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小时执行的计划任务:

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) );
取消还未执行的计划任务

这个方法同时适用于重复执行和仅执行一次,只需要提供指定计划任务的下一个执行时间的时间戳及其参数(没有参数可留空):

$timestamp = wp_next_scheduled( 'your_cron', array($arg1, $arg2) );
wp_unschedule_event( $timestamp, 'your_cron', array($arg1, $arg2) );

或者更野蛮一点,取消所有的该计划任务的节点,如果指定了参数,就是取消所有包含该参数的计划任务。。

wp_clear_scheduled_hook( 'your_cron', array($arg1, $arg2) );
判断计划任务是否存在

有两种方法:

$schedule = wp_get_schedule( 'your_cron', array($arg1, $arg2) );
// $schedule == minutely
$schedule = wp_next_scheduled( 'your_schedule', array($arg) );
// $schedule == 194154874541

如果不存在,都会返回false。

喜欢这篇文章吗,不妨分享给朋友们吧!