为了让您的任务执行,您必须创建自己的自定义钩子并给该钩子执行一个函数的名称。 这是非常重要的一步。 忘记它,你的任务永远不会运行。
以下将创建钩子。 第一个参数是挂钩的名称,第二个参数是要调用的函数的名称。
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请求。