WordPress插件开发:WP-Cron

2025-11-03 243
WordPress

类型:CMS系统

简介:一款开源的内容管理系统(CMS),用于构建和管理网站。

WordPress中的核心功能和定制发布功能无一不使用WP-Cron系统,WP-Cron是WordPress中处理任务的基于时间的任务调度系统,其工作原理是在页面加载时检查计划任务列表以查看需要运行的任务。下面将由站长百科详细介绍WP-Cron的工作原理及使用教程。

一、WP-Cron与系统Cron的本质区别

Cron是一个基于时间的任务调度系统,支持在Unix系统使用。Unix系统若不在特定的时间(如每天凌晨3点)执行,他就永远不会执行了。而WP-Cron和基于Unix系统的Cron不太一样,WP-Cron只是在页面加载时触发,检查计划任务将在页面加载时执行。若在执行时间内未触发,WP-Cron将在下一次页面加载的时候执行过期而没有运行的任务,不管这个任务过期过久,任务将一直在队列中,直到有一个页面加载时触发他们,因此通过WP-Cron设置的计划任务不会丢失。

虽然当下很多虚拟主机不支持用户访问系统Cron,但由于WordPress核心和很多插件都需要Cron用来执行基于时间的一些任务,因此Cron在WordPress网站的应用非常广泛。虽然不能保证WP-Cron会在特定的时间执行,但是也有很大的几率用来完成网站管理员设置的计划任务。

二、WordPress任务计划

Unix系统Cron以绝对时间点(如每小时第10分钟)为调度单位,而WP-Cron采用相对时间间隔模式:先设定首次执行时间,再定义间隔周期(以秒为单位),之后按周期重复执行。

WordPress预定义了三个常用间隔和一个添加自定义间隔的简单方法:

add_filter( 'cron_schedules', 'example_add_cron_interval' );

function example_add_cron_interval( $schedules ) {
$schedules['five_seconds'] = array(
'interval' => 5,
'display' => esc_html__( 'Every Five Seconds' ),
);

return $schedules;
}

添加后,该间隔可在任务调度时直接引用,并以每5秒钟运行一次Cron任务。

三、创建和管理WP-Cron任务

1、注册任务钩子与回调函数

WP-Cron通过钩子和回调机制执行任务,需先创建一个自定义钩子,并绑定执行逻辑的回调函数。示例:

add_action( 'bl_cron_hook', 'bl_cron_exec' );

注意:WP-Cron不会自动去重,若重复调用调度函数,会创建多个相同任务。因此需先用wp_next_scheduled()检查任务是否已存在。

wp_next_scheduled( 'bl_cron_hook' );

使用wp_schedule_event()函数调度任务,需传入三个必要参数:首次执行时间戳($timestamp)、间隔名称($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' );
}

2、取消任务调度

当插件停用或任务不再需要时,需及时取消调度,避免无效任务占用资源。使用wp_unschedule_event()函数实现,步骤如下:

用wp_next_scheduled()获取任务的下一次执行时间戳传入时间戳和钩子名称取消任务。

示例代码:

$timestamp = wp_next_scheduled( 'bl_cron_hook' );
wp_unschedule_event( $timestamp, 'bl_cron_hook' );

在插件停用时自动清理任务,通过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与系统Cron结合

WP-Cron依赖页面访问的特性,可能导致低访问量网站的任务延迟。若需严格定时,可将WP-Cron与系统Cron结合。

1、禁用WP-Cron的自动触发

在wp-config.php中添加常量,关闭页面加载时的自动检查:

define('DISABLE_WP_CRON', true);

2、配置系统Cron定时触发

通过系统Cron定期访问wp-cron.php文件,强制触发任务检查。

Linux/Mac系统:

执行crontab-e编辑定时任务,添加每15分钟触发一次的配置:

crontab -e

Windows系统:

通过任务计划程序创建基本任务,动作设置为运行PowerShell命令:

powershell Invoke-WebRequest http://YOUR_SITE_URL/wp-cron.php

不考虑的时间段使用 * 号代替:

15 * * * * command

使用wget工具访问WordPress的Cron脚本:

get http://YOUR_SITE_URL/wp-cron.php

若需要再每天凌晨触发网站的WordPress Cron的Unix Cron设置:

0 0 * * * wget http://YOUR_SITE_URL/wp-cron.php

五、WP-Cron任务测试与调试

1、查看所有计划任务

WordPress提供_get_cron_array()函数,可输出当前所有计划任务的详细信息。示例:

function bl_print_tasks() {
echo '<pre>'; var_dump( _get_cron_array() ); echo '</pre>';
}

2、手动触发任务执行

在浏览器中直接访问http://你的域名/wp-cron.php?doing_wp_cron,可强制触发一次任务检查,适合测试任务是否正常运行。

  • 广告合作

  • QQ群号:4114653

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。