安排 WP-Cron 定时事件

WP-Cron系统通过钩子添加新的计划任务。

添加钩子

要让任务运行,必须创建自定义钩子,并将要执行的函数名称关联到它。这一步非常重要;遗漏后,任务不会运行。

下面的示例创建一个钩子。第一个参数是钩子名称,第二个是要调用的函数名称:

add_action( 'bl_cron_hook', 'bl_cron_exec' );

函数名中的 bl_ 是函数前缀。前缀的重要性以及action的更多说明见文末原文链接。

安排任务

WP-Cron是一个简单的任务调度器。任务通过调用执行函数的钩子添加。但是,多次调用 wp_schedule_event(),即使钩子名称相同,也会多次安排事件。如果每次页面加载都添加任务,可能导致同一任务被安排数千次。这并非预期行为。

WordPress提供 wp_next_scheduled() 检查某个钩子是否已经安排。原文以钩子名作为一个参数,描述返回下一次执行的时间戳,或在未安排时返回false。用法如下:

wp_next_scheduled( 'bl_cron_hook' )

周期任务通过 wp_schedule_event() 安排。原文介绍三个必需参数,以及一个可以传给WP-Cron任务执行函数的数组参数;这里关注前三个:

  • $timestamp:任务首次执行的UNIX时间戳。
  • $recurrence:任务重复间隔的名称,对应以秒表示的间隔。
  • $hook:要调用的自定义钩子名称。

使用原教程前一节创建的五秒间隔,以及上面创建的钩子:

wp_schedule_event( time(), 'five_seconds', 'bl_cron_hook' );

先确保任务尚未安排,因此用检查包裹调度代码:

if ( ! wp_next_scheduled( 'bl_cron_hook' ) ) {
    wp_schedule_event( time(), 'five_seconds', 'bl_cron_hook' );
}

取消任务安排

不再需要任务时,可以通过 wp_unschedule_event() 取消安排。原文介绍两个参数:

  • $timestamp:任务下一次发生的时间戳。
  • $hook:自定义钩子名称。

这个函数不仅取消时间戳指定的任务,也取消该任务未来的所有重复执行。通常不知道下一次任务的时间戳,可以通过 wp_next_scheduled() 查找。这里关注其 $hook 参数,即用于执行任务的钩子名。

组合起来:

$timestamp = wp_next_scheduled( 'bl_cron_hook' );
wp_unschedule_event( $timestamp, 'bl_cron_hook' );

不再需要任务时,一定要取消安排。否则WordPress会继续尝试执行,即使任务已不再使用,甚至插件已停用或删除。尤其应在插件停用时取消任务。

WordPress.org插件目录中仍有一些插件没有清理自身任务。如果发现这样的插件,原文建议通知作者更新代码。register_deactivation_hook() 允许开发者在插件停用时执行函数,设置如下:

register_deactivation_hook( __FILE__, 'bl_deactivate' ); 

function bl_deactivate() {
    $timestamp = wp_next_scheduled( 'bl_cron_hook' );
    wp_unschedule_event( $timestamp, 'bl_cron_hook' );
}

激活与停用钩子的进一步说明见原文相关链接。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容