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' );
}
您可以阅读更多关于激活和停用钩子的详细信息 这里。