WordPress 教程:在 WordPress 中如何设置定时作业

我们知道 Linux 服务器有个 Cron 的功能,可以用来设置定时执行的作业,但是并不是每个人都熟悉 Linux 系统,并且也不是所有的主机管理面板都有 Cron 栏目。

其实 WordPress 本身也有类似于 Cron 的功能,让我们可以直接在 WordPress 中定义和执行定时作业,WordPress 把这个功能定义为:WP-Cron,比如 WordPress 本身的文章预发布功能就是基于 WP-Cron 实现的。

WP-Cron 功能是基于页面浏览的,所以时间上不会十分准确,但是随着站点流量增大,这个准确度会越来越高的。WP-Cron 定义了一套完整的 API,让 WordPress 第三方开发者可以通过插件的去定义定时作业。

可视化管理定时作业列表

为了更加方便管理定时作业,建议大家首先安装 WPJAM Basic 插件,它的定时作业管理功能可以让我们可视化管理 WordPress 的定时作业,首先在后台展示系统现有的所有定时作业列表:

WPJAM Basic - CDN加速 - 定时作业列表

在该界面,可以立即执行定时作业,也可以删除,或者直接新增定时作业。

定义定义作业

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 参数。


©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。