处理 WordPress 错过计划和 WP-Cron 延迟,覆盖站点健康、循环请求、低流量触发、宝塔计划任务、系统 cron、验证与回退。
直接处理顺序:WordPress 文章显示“错过计划”时,先进入“工具 → 站点健康 → 状态”查看是否有循环请求或计划任务错误,再确认站点能否从服务器访问自身域名。低访问量网站可以把 WP-Cron 改为系统定时任务每 5 分钟触发一次;在系统任务验证成功前,不要先设置 DISABLE_WP_CRON,否则定时发布、备份、邮件和插件队列可能全部停止。
数据与操作风险:只读检查本身不收费,也不会删除文章。系统定时任务会产生少量 CPU 和 PHP 请求;频率过高、任务本身积压或插件死循环时可能放大负载。修改 wp-config.php 前先备份文件,保留服务器控制台或 SSH 入口,并记录现有计划任务。
为什么有人访问网站后,计划文章才突然发布
WP-Cron 不是一直运行的系统守护进程。WordPress 在页面加载时检查到期任务,再尝试发起一个访问自身站点的循环请求。站点长时间没有访问、循环请求被防火墙拦截、域名解析到旧地址、Basic Auth 阻挡、插件冲突或 PHP 进程不足,都可能让计划任务延迟。
因此“错过计划”并不等于文章数据损坏。先记下计划发布时间、WordPress 时区、服务器时间和第一次实际发布的时间。若所有任务都延迟,优先查 WP-Cron 触发链;只有某个插件任务失败时,再查该插件的钩子和日志。
先做哪些不改配置的检查
- 进入“设置 → 常规”,确认站点时区;不要只看浏览器本地时间。
- 进入“工具 → 站点健康”,记录循环请求、REST API 和后台任务提示。
- 在服务器上请求站点首页和
wp-cron.php,确认 DNS、TLS 和返回码。 - 检查 PHP、Nginx 和 WordPress 调试日志中同一时间的超时、403、502 或致命错误。
- 确认缓存/CDN、安全插件和服务器防火墙没有拦截服务器访问自己的正式域名。
下面命令只验证连通性。把域名替换为自己的站点,不要在公开日志中输出带密钥的 cron URL:
date --iso-8601=seconds
curl -I --max-time 10 https://www.example.com/
curl -I --max-time 10 https://www.example.com/wp-cron.php
首页和 wp-cron.php 都超时,先处理 DNS、证书或回源网络;返回 401/403 时,检查访问控制和安全插件;返回 502/504 时,继续查看 PHP-FPM 和应用日志。wp-cron.php 返回空白或普通成功状态并不证明队列已经执行完,只证明入口可以到达。
什么时候改成系统定时任务
低流量站点、需要较准时发布、WooCommerce 或任务型插件较多时,系统 cron 通常比依赖访客触发稳定。宝塔用户可进入“计划任务 → 添加任务”,选择 Shell 脚本;普通 Linux 可使用 crontab 或 systemd timer。默认从每 5 分钟一次开始,不要复制每分钟高并发触发的模板。
可选两种触发方式:从本机请求 HTTPS 地址,能够顺带验证 DNS 和 TLS;或直接调用站点当前 PHP 版本执行 wp-cron.php,减少外部网络依赖。宝塔可能安装多个 PHP 版本,命令行 php 不一定等于站点使用的 PHP,因此必须从站点设置确认真实版本和路径。
*/5 * * * * /usr/bin/curl -fsS --max-time 30 https://www.example.com/wp-cron.php?doing_wp_cron >/dev/null
将域名替换为正式域名,并确认系统中 curl 的真实路径。任务需要留下失败日志和退出码;调试阶段不要把全部输出丢弃。若站点有访问密码或内部域名,优先用受控的本机 PHP 方式,不能把凭据直接写入所有用户可读的命令行。
什么时候才能关闭页面触发的 WP-Cron
只有系统任务已经连续成功触发,计划文章、插件任务和邮件队列都正常后,才在 wp-config.php 的“停止编辑”提示之前加入:
define( 'DISABLE_WP_CRON', true );
这行配置不会创建新的定时任务,只会停止页面加载时自动触发。系统 cron 写错、路径错误或服务器时间异常时,所有任务会静默积压。编辑后要运行 PHP 语法或站点访问检查,并保留原文件,以便立即删除该配置回退。
常见阻塞分别怎么处理
| 现象 | 判断 | 处理 |
|---|---|---|
| 低流量时延迟,高流量后恢复 | 依赖页面触发 | 建立系统定时任务,再关闭页面触发 |
| 站点健康提示循环请求失败 | 自身域名访问受阻 | 查 DNS、TLS、代理、Basic Auth 和安全策略 |
| 只有单个插件任务卡住 | 钩子报错或任务执行过慢 | 查看对应插件日志,先在测试站停用冲突插件 |
| 任务重复执行 | 多个触发器或任务未做幂等 | 确认只有一套系统任务,修复插件重复处理 |
| 发布时间相差固定小时数 | 时区而非 cron | 统一 WordPress、PHP 和系统时区显示 |
不要在生产站直接停用全部插件做长时间测试。先备份,在低峰复制到测试环境,或逐个停用最近变更的缓存、安全和任务插件。若排查时看到 502,可结合宝塔 PHP 502 排查;系统任务写法可参考cron 与 systemd timer 教程。
怎样证明已经修好
- 新建一篇仅供测试的草稿,安排在 10 分钟后发布。
- 在发布前后查看系统任务日志、PHP 日志和文章状态。
- 确认备份、邮件、缓存清理或队列插件的计划任务也继续执行。
- 重启 PHP-FPM 或服务器后,再覆盖一个完整触发周期。
- 为 cron 连续失败、任务积压和计划文章延迟建立告警。
系统任务不工作时,先删除或注释 DISABLE_WP_CRON,恢复页面触发,再修正系统任务。不要通过反复改文章发布时间掩盖根因。服务器时间异常时,按Ubuntu 时间同步核对,不要直接手工大幅拨钟。

