设置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' );
}
下一节:如前所述,WP-Cron不会连续运行,如果有关键任务必须按时运行,这可能是一个问题。 有一个简单的解决方案。 只需设置系统的任务调度程序,就可以按需要的间隔(或者在特定的时间)运行。 最简单的解决方案是使用工具向wp-cron.php文件发出Web请求。