安排 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 任务的函数。我们将重点关注前三个参数。参数如下:
-
$timestamp
– 该任务第一次执行的 UNIX 时间戳 -
$recurrence
– 以秒为单位重复执行任务的时间间隔的名称 -
$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()取消计划任务 。该函数采用以下两个参数:
-
$timestamp
– 下一次任务发生的时间戳 -
$hook
– 要调用的自定义钩子的名称
此函数不仅会取消时间戳指示的任务的计划,还会取消计划所有未来出现的任务。由于您可能不知道下一个任务的时间戳,因此还有另一个方便的函数wp_next_scheduled() 可以为您找到它。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' );
}
笔记:您可以在此处阅读有关激活和停用挂钩的更多信息。