首页 > Wordpress > 正文

WordPress 定时发布失败?wp-cron 排查指南

fenij 2026-08-14 36 Wordpress

头天晚上排好的 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,一次性解决

与其指望访客替你触发,不如让服务器自己按点敲。三步就完事。

1
wp-config.php 里关掉自带触发:define('DISABLE_WP_CRON', true);

2
服务器上 crontab -e,加一行每 5 分钟触发

3
等 10 分钟,回后台确认「错过计划」不再新增

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。

几个容易漏掉的坑

⏱️
5 分钟
系统 cron 推荐间隔

🔧
90s
wp-cron 同任务重跑锁

📊
10 分钟
超过即判定「错过计划」

页面缓存插件如果把 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 留言说说你的环境和报错,我们一起看看卡在哪一层。

相关完整手册

系统化的排查与配置思路,建议顺手收藏这几篇完整手册: