头天晚上排好的 5 篇定时发布,第二天打开后台一看,全挂着「错过计划」(Missed schedule)。文章还在,就是没推出去。这问题我在客户站上遇到过十几次,根因基本都落在 wp-cron 身上。
关键在于 WordPress 的定时任务压根不是系统 cron。它叫 wp-cron,机制很朴素:有人访问你站点时,PHP 顺手检查一下有没有到期任务,有就跑一遍。没人访问,就没人触发。凌晨三点的定时发布之所以失败,往往就是那个时间点站上一个人都没有。
先分清两种症状
两种表现的排查方向完全不同,别一上来就乱改配置。
| 症状 | 说明 | 先查哪里 |
|---|---|---|
| 偶尔「错过计划」 | 任务能跑,只是延迟到有访问才执行 | 站点流量、时区设置 |
| 全部任务不跑 | 备份、邮件、更新检查一起停摆 | DISABLE_WP_CRON、wp-cron.php 可达性 |
| 时间差几小时 | 发出去了但不是你设的点 | 服务器时区 vs 后台时区 |
三条命令确认 wp-cron 活不活
第一条,直接把 wp-cron.php 请求一遍,看它自己能不能跑通:
curl -s -o /dev/null -w "%{http_code}\n" "https://你的域名/wp-cron.php?doing_wp_cron"
返回 200 说明文件本身没问题。返回 404,去看是不是被安全插件或重写规则挡了。返回 500,翻 PHP 错误日志,通常是某个插件在 cron 钩子里抛异常。
第二条,翻 wp-config.php 找这一行:
define('DISABLE_WP_CRON', true);
不少「WordPress 提速」教程会让人加这句。加完如果没配系统 cron 顶上,定时任务就彻底停了。这是我见过最多的翻车点。
第三条,装了 WP-CLI 就直接看队列:
wp cron event list
# 想立刻把逾期的补跑掉
wp cron event run --due-now
逾期任务在 next_run_relative 那列会显示成负数或 now,一眼就能看出堆了多少。
换成系统 cron,一次性解决
与其指望访客替你触发,不如让服务器自己按点敲。三步就完事。
define('DISABLE_WP_CRON', true);crontab -e,加一行每 5 分钟触发crontab 那行可以用 curl:
*/5 * * * * curl -s "https://你的域名/wp-cron.php?doing_wp_cron" > /dev/null 2>&1
装了 WP-CLI 的话这么写更干净,不走 HTTP,绕开所有缓存和 WAF:
*/5 * * * * cd /var/www/html && /usr/local/bin/wp cron event run --due-now --quiet
注意 crontab 里必须写 wp 的绝对路径,which wp 查一下。cron 的 PATH 很短,写 wp 大概率报 command not found。
几个容易漏掉的坑
页面缓存插件如果把 wp-cron.php 也缓存了,第二次请求直接返回缓存,任务永远不跑。W3 Total Cache、LiteSpeed Cache 都要把这个 URL 排除。
Cloudflare 或 WAF 有时会拦带查询参数的自请求,日志里能看到 403。加白名单。
时区不一致是另一个隐形杀手。服务器 date 显示 UTC,后台设的是上海时间,你以为的凌晨 3 点其实是上午 11 点。两边都核一遍。
站点套了 HTTP 基础认证(.htpasswd)的话,wp-cron 请求自己会吃 401。要么在 Nginx 里给这个路径开个例外,要么直接改用 WP-CLI 方案。
常见问题
问:配了系统 cron,还是偶尔出现「错过计划」怎么办?
先确认 cron 真在跑:grep CRON /var/log/syslog | tail -20。如果日志里有记录但任务没执行,多半是某个插件的 cron 钩子卡住,把整个队列堵住了。用 wp cron event list 看是哪个 hook 一直逾期,逐个排除。
问:每 5 分钟触发一次,服务器压力大不大?
基本可以忽略。没有到期任务时,wp-cron 加载完就退出,耗时通常在 100ms 以内。真正吃资源的是任务本身,比如备份插件的全站打包,那跟触发频率无关。
问:已经变成「错过计划」的文章怎么补发?
后台快速编辑改成「立即发布」最省事。批量的话用 wp post list --post_status=future 找出来,再 wp post update <ID> --post_status=publish。
踩过别的 wp-cron 坑,或者按这套配完还是不行,欢迎到 fenij.com 留言说说你的环境和报错,我们一起看看卡在哪一层。