调度 WP Cron 事件
WP Cron 系统使用钩子来添加新的定时任务。
添加钩子
为了让你的任务能够运行,你必须创建自己的自定义钩子,并给这个钩子指定要执行的函数名。这是非常重要的一步。如果忘记,你的任务将永远不会运行。
以下示例将创建一个钩子。第一个参数是你正在创建的钩子名称,第二个是要调用的函数名称。
add_action( 'bl_cron_hook', 'bl_cron_exec' );
[info]请记住,函数名中的 bl_ 部分是一个 函数前缀。你可以在此了解为什么前缀很重要。[/info]
[info]你可以在此阅读更多关于动作的信息。[/info]
任务调度
一个重要注意事项是 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' );
}
[info]你可以在此处了解更多关于激活和停用钩子的信息此处。[/info]
谢谢你的反馈!