WordPress中文开发手册

WordPress插件开发 — 安排WP-Cron 事件

计划重复的任务

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

以下将创建钩子。 第一个参数是挂钩的名称,第二个参数是要调用的函数的名称。

add_action( 'bl_cron_hook', 'bl_cron_exec' );

现在对实际的任务调度。 另一个重要的注意事项是WP-Cron在调度任务时是天真的。 任务由为任务提供的钩子驱动,但是如果您多次调用wp_schedule_event(),即使使用相同的钩子名称,事件将被多次调度。 如果您的代码在每个页面加载任务,这可能导致任务安排几千次。 可能不是一个好主意 WordPress提供了一个名为wp_next_scheduled()的方便函数来检查是否已经安排了一个特定的钩子。

wp_next_scheduled()取一个参数,即挂钩的名称。 它将返回一个包含下一个执行时间戳或false的字符串,表示该任务未被安排。 它像这样使用:

wp_next_scheduled( 'bl_cron_hook' )

使用wp_schedule_event()完成计划循环任务。 此函数需要三个必需参数,另外一个附加参数是可以传递给执行wp-cron任务的函数的数组。 我们将重点关注前三个参数。 参数如下:

  • $timestamp - 此任务应该首次执行的UNIX时间戳
  • $recurrence - 任务将以秒为单位重复的间隔的名称
  • $hook - 我们要调用的自定义钩子的名称

我们将使用之前创建的5秒间隔和钩子,如:

wp_schedule_event( time(), '5seconds', 'bl_cron_hook' );

记住,我们需要首先确保任务尚未安排,其完整代码如下:

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

计划外任务

当您不再需要安排任务时,可以使用wp_unschedule_event()取消任务。 此功能需要以下两个参数:

  • $timestamp - 任务下一次出现的时间戳
  • $hook - 要调用的自定义钩子的名称

此功能不仅会取消对时间戳指示的任务进行调度,还会取消调度任务的所有将来的发生。 因为你可能不知道下一个任务的时间戳是有功能的,它将为你找到它的wp_next_schedule()。 wp_next_scheduled()需要一个参数(我们关心的):

  • $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' );
}
Tags ,