跳转到主要内容

调度 WP Cron 事件

WP Cron 系统使用钩子来添加新的计划任务。

添加钩子

为了让您的任务运行,您必须创建自己的自定义挂钩,并为该挂钩指定要执行的函数的名称。这是非常重要的一步。忘记它,你的任务将永远不会运行。

以下示例将创建一个钩子。第一个参数是您正在创建的钩子的名称,第二个参数是要调用的函数的名称。


add_action( 'bl_cron_hook', 'bl_cron_exec' );
笔记:请记住,函数名称的“bl_”部分是函数前缀您可以在此处了解前缀为何如此重要。

笔记:您可以在此处阅读有关操作的更多信息。

安排任务

需要注意的是,WP-Cron 是一个简单的任务调度程序。众所周知,任务是通过创建的钩子添加的,该钩子是为了调用运行所需任务的函数而创建的。但是,如果多次调用wp_schedule_event(),即使使用相同的挂钩名称,该事件也会被安排多次。如果您的代码在每次页面加载时添加任务,则可能会导致该任务被调度数千次。这不是你想要的。

WordPress 提供了一个名为wp_next_scheduled()的便捷函数 来检查特定的钩子是否已被调度。wp_next_scheduled()采用一个参数,即钩子名称。它将返回一个包含下一次执行的时间戳的字符串,或者返回 false,表示该任务未安排。它的使用方式如下:


wp_next_scheduled( 'bl_cron_hook' )

安排重复任务是通过wp_schedule_event()完成的。该函数采用三个必需参数和一个附加参数,该参数是一个可以传递给执行 wp-cron 任务的函数的数组。我们将重点关注前三个参数。参数如下:

  1. $timestamp– 该任务第一次执行的 UNIX 时间戳
  2. $recurrence– 任务重复执行的时间间隔名称(以秒为单位)
  3. $hook– 我们要调用的自定义挂钩的名称

我们将使用此处创建的 5 秒间隔和上面创建的挂钩,如下所示:


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()取消计划任务 。该函数采用以下两个参数:

  1. $timestamp– 下一次任务发生的时间戳
  2. $hook– 要调用的自定义钩子的名称

此函数不仅会取消安排由时间戳指示的任务,还会取消安排该任务的所有未来发生。由于您可能不知道下一个任务的时间戳,因此还有另一个方便的函数wp_next_scheduled() 可以为您找到它。wp_next_scheduled()采用一个参数(我们关心的):

  1. $hook– 执行任务时调用的钩子的名称

将它们放在一起,代码如下所示:


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

当您不再需要任务时取消计划任务非常重要,因为 WordPress 将继续尝试执行这些任务,即使它们不再使用(或者甚至在您的插件已停用或删除之后)。需要记住取消任务安排的一个重要位置是插件停用时。

不幸的是,WordPress.org 插件目录中有许多插件无法自行清理。如果您发现这些插件之一,请告知作者更新其代码。WordPress 提供了一个名为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' );
}

笔记:您可以在此处阅读有关激活和停用挂钩的更多信息。