安排 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' );
}

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