使用 WP-Cron让WordPress定时执行任务

我们知道 Linux 服务器有个 Cron 的功能,可以让你定时去执行一些作业,但是并不是每个人都对 Linux 系统很熟悉,并且不是所有的主机管理面板都有 Cron 这个栏目。其实 WordPress 本身也有类似于 Cron 的功能,让你可以直接在 WordPress 后台执行安排好任何,定时执行。

WP-Cron 功能是基于页面浏览的,所以时间上不会那么准确,会相差一些,但是随着博客流量增大,这个准确度会越来越高的。比如 WordPress 本身的文章预发布功能就是基于 WP-Cron 实现的。WP-Cron 还定义一套完整的 API,让开发者可以自己通过插件的方式定义一些作业定时执行,需要开发者定义好任务执行的频率和回调函数。

定义一个任务

WP-Cron 支持两种类型的任务:

单一的未来事件(比如设定某篇文章在将来某个时间发布)
重复发生的事件,比如每天,每个星期等一段时间内重复发生的事件(比如定时抓取某个博客的 RSS 源)

定义单一的未来事件

我们可以使用函数 wp_schedule_single_event( $timestamp, $hook, $args ) 来定义单一的未来事件:

$timestamp:事件发生时的时间戳。
$hook:事件调用的回调函数(大部分应该在1分钟内完成)
$args:传给回调函数的参数数组,这个参数是可选的

定义重复发生的事件

我们可以使用函数 wp_schedule_event( $timestamp, $recurrence, $hook, $args ) 来定义重复发生的时间。

$timestamp,$hook 和 $args 这三个参数含义和 wp_schedule_single_event。
$recurrence:事件重复的频率。
WordPress 已经内置了两种重复频率 — huorly 和 daily。但是如果还不够用,比如你定义每周发生的时间,比如:weekly?WP-Cron 也支持自定义事件频率类型。

首先我们可以使用函数 wp_get_schedules() 得到关于‘hourly’ 和 ‘daily’ 的信息,使用 print_r() 打印这个函数的输出:

  1. Array
  2. (
  3.     [hourly] => Array
  4.         (
  5.             [interval] => 3600
  6.             [display] => Once Hourly
  7.         )
  8.     [daily] => Array
  9.         (
  10.             [interval] => 86400
  11.             [display] => Once Daily
  12.         )
  13. )

从上面的代码,我们可以很清楚的知道,这个频率内部是使用秒数来定义的。从 wp_get_schedules() 的源代码,我们可以通过 cron_schedule 这个 filter 去自定义频率类型,比如我们定义每周和每半月的频率类型:

  1. function wpjam_more_reccurences() {
  2.     return array(
  3.         ‘weekly’ => array(‘interval’ => 604800, ‘display’ => ‘Once Weekly’),
  4.         ‘fortnightly’ => array(‘interval’ => 1209600, ‘display’ => ‘Once Fortnightly’),
  5.     );
  6. }
  7. add_filter(‘cron_schedules’, ‘wpjam_more_reccurences’);

再次打印 wp_get_schedules() 函数的输出:

  1. Array
  2. (
  3.     [weekly] => Array
  4.         (
  5.             [interval] => 604800
  6.             [display] => Once Weekly
  7.         )
  8.     [fortnightly] => Array
  9.         (
  10.             [interval] => 1209600
  11.             [display] => Once Fortnightly
  12.         )
  13.     [hourly] => Array
  14.         (
  15.             [interval] => 3600
  16.             [display] => Once Hourly
  17.         )
  18.     [daily] => Array
  19.         (
  20.             [interval] => 86400
  21.             [display] => Once Daily
  22.         )
  23. )

定义任务事件。
我们定义每天都要做的一个事件:wpjam_daily_function_hook():

  1. if (!wp_next_scheduled(‘wpjam_daily_function_hook’)) {
  2.     wp_schedule_event( time(), ‘daily’, ‘wpjam_daily_function_hook’ );
  3. }

就像上面所说的,‘wpjam_daily_function_hook’ 这个函数会被调用,并且只需调用一次,这就是为什么去检查 wp_next_scheduled(‘my_daily_function_hook’) 返回的结果,如果已经安排返回下次安排的时间,如果没有被安排返回否,我们要确保事件只被安排一次。

上面定义好了事件,现在我们需要定义一个函数 wpjam_daily_function() 去执行具体的功能:

  1. add_action( ‘wpjam_daily_function_hook’, ‘wpjam_daily_function’);
  2. function wpjam_daily_function() {
  3.     print “I was just called. I’ll be called at the same time tomorrow”;
  4. }

这样在每天相同时间,第二个浏览站点任何页面的人将看到有文字显示在页面上。
下面在做个示例每个小时给某邮箱发一个邮件

  1. //下面的代码放在 functions.php 文件里面,cron 一般用不着,根据需要具体使用才可以的。
  2. add_action(‘my_hourly_event’, ‘do_this_hourly’);
  3. function my_activation() {
  4.     if ( !wp_next_scheduled( ‘my_hourly_event’ ) ) {
  5.         wp_schedule_event(time(), ‘hourly’, ‘my_hourly_event’);
  6.     }
  7. }
  8. add_action(‘wp’, ‘my_activation’);
  9. function do_this_hourly() {
  10.     //填写 PHP 代码,下面举例
  11.         wp_mail( “xxxx@qq.com”“这是一个测试邮件! ““这是测试邮件标题”“这是测试邮件内容”);
  12. }
常见问题
Wordpress模板插件上传安装提示错误怎么办?
本站在打包插件或者模板的时候,一般会将官方文档、官方申明、已经其他文件一起打包,因此,大部分插件模板在安装前需要解压缩。
购买后无法下载或者提取码错误怎么办?
请联系客服QQ:125252828 或者微信:dobunkan,由于骚扰信息过多,加好友时请说明原由!
小白建站啥都不会怎么办?
请与客服联系,沟通具体的技术支持。由于搭建环境、调试程序需要花费一些时间,可能会收取一些费用。
怎样催促站长更新?
直接微信或者QQ联系本站客服,提供最新版本号以及软件名称,客服会在第一时间更新,如果超过2-3年未更新的请先联系站长后再确认是否需要下载。
为什么打开链接看不到最新版本?
因为网盘默认是按名称排序,最新版本不一定会排在第一个,请打开链接后点击右上角的“修改日期”,这时候更新列表就会按更新日期排序了。
原文链接:https://www.dobunkan.com/tools/26226,转载请注明出处。
0

评论0

请先
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录

学课技术网欢迎您的加入!