首页 / 插件开发手册 / 计划任务 Cron / WP-Cron计划任务事件

WP-Cron计划任务事件

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

 

添加钩子

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

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

add_action( 'bl_cron_hook', 'bl_cron_exec' );
Note:请记住,函数名的“bl_”部分是函数前缀。您可以通过这里了解为什么前缀在很重要。

Note:您可以在这里阅读有关动作的更多信息。

 

添加计划任务

值得注意的是,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' );
}

Note:您可以在这里阅读更多关于插件启用和停用钩子的信息。