我们知道 Linux 服务器有个 Cron 的功能,可以用来设置定时执行的作业,但是并不是每个人都熟悉 Linux 系统,并且也不是所有的主机管理面板都有 Cron 栏目。
其实 WordPress 本身也有类似于 Cron 的功能,让我们可以直接在 WordPress 中定义和执行定时作业,WordPress 把这个功能定义为:WP-Cron,比如 WordPress 本身的文章预发布功能就是基于 WP-Cron 实现的。
WP-Cron 功能是基于页面浏览的,所以时间上不会十分准确,但是随着站点流量增大,这个准确度会越来越高的。WP-Cron 定义了一套完整的 API,让 WordPress 第三方开发者可以通过插件的去定义定时作业。
可视化管理定时作业列表
为了更加方便管理定时作业,建议大家首先安装 WPJAM Basic 插件,它的定时作业管理功能可以让我们可视化管理 WordPress 的定时作业,首先在后台展示系统现有的所有定时作业列表:
在该界面,可以立即执行定时作业,也可以删除,或者直接新增定时作业。
定义定义作业
WP-Cron 支持两种类型的定义作业:
- 单一的未来事件(比如设定某篇文章在将来某个时间发布)
- 重复发生的事件,比如每天或每个星期等一段时间内重复发生的事件(比如定时清理无用的信息)
定义单一的未来事件
我们可以使用函数 wp_schedule_single_event($timestamp, $hook, $args)
来定义单一的未来事件,它有三个参数:
$timestamp
:事件发生的时间戳。$hook
:事件调用的 hook,需要预先通过add_action
关联定时作业的回调函数。$args
:传给回调函数的参数数组。
定义重复发生的事件
我们可以使用函数 wp_schedule_event($timestamp, $recurrence, $hook, $args)
来定义重复发生的时间。
$timestamp
,$hook
和$args
这三个参数含义和wp_schedule_single_event
的一样。$recurrence
:事件重复的频率。
定时作业的频率
WordPress 已经内置了四种重复频率:
频率 | 描述 |
---|---|
hourly | 每小时1次 |
twicedaily | 每天2次 -- 12小时1次 |
daily | 每天1次 -- 24小时1次 |
weekly | 每周1次 |
但是如果还不够用,比如每15分钟1次,甚至频率更高一些,每5分钟1次。WP-Cron 也支持自定义事件频率类型。
查看 wp_get_schedules()
函数的源代码,频率内部是使用秒数来定义的,然后我们可以通过 cron_schedule
这个 filter 去自定义频率:
add_filter('cron_schedules', unction($schedules){
return array_merge($schedules, [
'five_minutes' => ['interval'=>300, 'display'=>'每5分钟一次'],
'fifteen_minutes' => ['interval'=>900, 'display'=>'每15分钟一次'],
]);
});
WPJAM Basic 已经定了每15分钟1次(fifteen_minutes
)和每5分钟1次(five_minutes
)这两个频率,你直接使用即可。
定时作业的 hook 和回调函数
从上面可知,WordPress 的定时作业对应就是一个 hook,然后通过 hook 关联具体的回调函数,比如我们要定义一个每天都要执行的作业,我们把这个作业 hook 定义为:wpjam_daily_function_hook
,具体的回调函数为:wpjam_daily_function
。
function wpjam_daily_function(){
// 把每天定时执行的作业具体的代码写在这里
}
把回调函数关联到 hook 上:
add_action( 'wpjam_daily_function_hook', 'wpjam_daily_function');
将 hook 加入到定时作业列表,有两种方法:
1. 代码的方式:
if(!wp_next_scheduled('wpjam_daily_function_hook')){
wp_schedule_event(time(), 'daily', 'wpjam_daily_function_hook');
}
上面代码,首先使用函数 wp_next_scheduled
检测 wpjam_daily_function_hook
是否已经被加入到定时作业列表中,如果没有,我们使用 wp_schedule_event
函数加入,这样可以确保作业只被定义一次。
2. 在 WPJAM Basic 定时作业管理后台加入:
这里非常好理解,就不再想讲,只是后通过界面添加的方式,暂时不支持参数,即 $args
参数。
标签:wordpress教学