计划任务,顾名思义,就是将一些将来需要做的事情交给Wordpress自动去处理,就像定时发布。有时候我们需要自定义其他的任务,比如自动清理未使用的媒体库图片,自动将注册时间超过某时段的用户升级为高阶角色。
WordPress提供了很方便的方法帮助我们来实现这些功能,该方法分为两类,一类是可重复执行的计划任务,一类是仅执行一次的计划任务。
可重复执行的计划任务
该方法首先需要一个重复的时段,系统默认提供了三个重复时段,可以通过以下方法获取:
<?phpwp_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天,如果你想增加自定义时间段每分钟:
<?phpadd_filter('cron_schedules', 'new_interval');function new_interval($interval) { $interval['minutely'] = array( 'interval' => 60, 'display' => __('minutely', YOURTEXTDOMAIN) ); return $interval;}?>
然后,你就可以在这个时间段上定制计划任务了:
<?phpif (!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小时执行的计划任务:
<?phpfunction 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) );?>
或者更野蛮一点,取消所有的该计划任务的节点,如果指定了参数,就是取消所有包含该参数的计划任务。。
<?phpwp_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。