WP-Cron 是 WordPress 内置的定时任务系统。 “Cron” 这个词来自 Unix/Linux 的计划任务系统,而 “WP-Cron” 则是它的 PHP 模拟版。

它的主要功能是,在特定的时间或周期内自动执行某些任务,比如:

  • 定时发布文章 检查插件、主题、核心更新
  • 清理临时文件、缓存
  • 发送定期邮件
  • 执行开发者自定义的计划任务(wp_schedule_event())

WP-Cron不会像系统的 Cron 那样按时间自动执行,而是每当有用户访问网站页面时才会触发; 如果没人访问网站,那么任务就不会执行,大致流程图如下:

用户访问任意页面 → 加载WP环境 →  执行相关代码渲染页面呈现给用户
                       ↓
              HTTP异步请求(wp-cron.php)
                       ↓
               检查任务系统并执行任务

假设你设置了一篇文章在“凌晨 2 点”自动发布, 但如果你的网站凌晨无人访问,文章就要等到下一个访问者到来时才会被发布,比如4点访问,那就在4点左右发布。

从以上可以看出,WP-Cron虽然提供了开箱即用的方案,不依赖服务器配置,但是缺点也很明显:

  • 不是真的定时任务,访问量少的时候可能延迟执行任务,且误差不可控
  • 流量大的时候,每次都要请求 wp-cron.php ,造成不必要的性能开销

在生产环境中(尤其是高访问量或重要项目),推荐禁用默认的 WP-Cron,改用系统级任务调度(如 Linux Crontab)定时执行。

原因很简单: 系统计划任务更稳定、更准确、性能更好。

禁用默认 WP-Cron

在 wp-config.php 中添加:

define('DISABLE_WP_CRON', true);

这样 WordPress 就不会在每次访问时HTTP请求调用 wp-cron.php 了。

此时定时任务系统已失效,如果你就只想要这个失效的效果,那就可以了。

使用服务器定时任务(Crontab)

核心就是,http请求 https://你的域名/wp-cron.php?doing_wp_cron

所以不管是用本机服务器的Crontab,还是其他服务器,亦或是其他平台程序,只要能做到:定时访问 wp-cron.php 即可。

这里以网站的服务器Crontab为例。

使用宝塔面板

宝塔面板定时任务很方便:在计划任务中添加任务,任务类型选择访问url,执行周期按需选择,url地址输入:

https://你的域名/wp-cron.php?doing_wp_cron

其他面板可能没有访问url,如果有类似 shell脚本 或 Command 任务类型也可以,内容输入:

curl -s https://你的域名/wp-cron.php?doing_wp_cron > /dev/null 2>&1

如果服务器全局有PHP命令,也可以用命令行的方式:

php /网站目录绝对路径/wp-cron.php > /dev/null 2>&1

关于执行周期,可以看你的网站定时任务最小的那个频率。

下载安装WPunion插件后,有一个定时任务模块,可以很方便查看网站所有的定时任务,比如我这里频率最小的是每小时一次,那就可以设置周期为60分钟(1小时)一次。这样减少不必要的请求,又能不耽误定时任务执行。

使用SSH手搓

如果你没有使用面板,通过SSH登录服务器后,输入命令  crontab -e  打开定时任务编辑器,在最后一行添加:

*/1 * * * * curl -s https://你的域名/wp-cron.php?doing_wp_cron > /dev/null 2>&1

按 “Ctrl+S” 保存,再按 “Ctrl+X” 退出 ( */1 * * * * 就是 “每 1 分钟执行一次” 的意思)