1. WP-Cron 是什么?
WP-Cron 是 WordPress 内置的定时任务系统。
WordPress 核心、主题和插件可以通过 WP-Cron 安排需要在未来执行的任务,例如:
- 发布计划文章
- 检查 WordPress 更新
- 检查主题和插件更新
- 执行自动备份
- 发送定时邮件
- 清理临时数据
- 运行 WooCommerce 或其他插件任务
- 生成统计数据
- 执行缓存清理
WP-Cron 和 Linux 系统中的 Cron 并不完全相同。
Linux Cron 会按照设定时间主动运行,而 WordPress 默认通常是在网站收到访问请求时,检查是否存在已经到期的计划任务。
因此如果网站访问量非常低,或者 WordPress 无法向自身发起回环请求,定时任务就可能延迟甚至长期不执行。
2. WP-Cron 不执行有哪些表现?
比较常见的表现包括:
- 计划文章到了时间仍然没有发布
- WordPress 显示“错过计划”
- 自动备份插件没有按时运行
- 邮件通知没有发送
- 缓存插件没有自动清理
- 网站地图没有定时更新
- WooCommerce 计划任务堆积
- 插件后台提示 Cron 不工作
- 站点健康提示回环请求失败
遇到这些问题时,不建议一开始就删除 WordPress 数据库中的 Cron 数据。
应该先确认 WP-Cron 当前状态和具体失败原因。
3. 进入 WordPress 网站目录
首先通过 SSH 登录服务器,然后进入 WordPress 根目录。
例如:
cd /www/wwwroot/example.com
查看当前目录:
ls -la
正常情况下应该能够看到:
wp-admin
wp-content
wp-includes
wp-config.php
wp-cron.php
如果没有这些文件,说明当前目录可能不是 WordPress 根目录。
后面的 WP-CLI 命令应在正确的 WordPress 目录中执行。
4. 检查 WP-CLI 是否可用
执行:
wp --info
查看当前 WordPress 版本:
wp core version
如果使用 root 用户执行 WP-CLI,部分环境需要添加:
--allow-root
例如:
wp core version --allow-root
如果服务器中没有全局 wp 命令,但网站目录中存在:
wp-cli.phar
可以使用:
php wp-cli.phar --info
后续命令也可以把 wp 替换成:
php wp-cli.phar
5. 测试 WP-Cron 是否能够正常启动

执行:
wp cron test
root 用户可以执行:
wp cron test --allow-root
正常情况下可能看到:
Success: WP-Cron spawning is working as expected.
这说明 WordPress 当前能够正常触发 WP-Cron。
如果出现 HTTP 403、连接失败、超时或其他错误,说明 WordPress 的 Cron 启动过程存在异常。
需要继续检查:
DISABLE_WP_CRON- 回环请求
- 防火墙
- CDN 或 WAF
- Basic Auth
- DNS
- HTTPS 证书
- Nginx 或 Apache 配置
6. 查看当前所有计划任务
执行:
wp cron event list
root 用户:
wp cron event list --allow-root
可以只显示常用字段:
wp cron event list \
--fields=hook,next_run_relative,recurrence \
--allow-root
可能看到:
hook next_run_relative recurrence
wp_version_check 8 minutes 12 hours
wp_update_plugins 8 minutes 12 hours
publish_future_post now Non-repeating
backup_job 2 hours 1 day
其中:
hook
表示计划任务名称。
next_run_relative
表示距离下一次执行还有多长时间。
recurrence
表示执行周期。
如果某个任务长期显示:
now
或者已经超时很久,通常说明它已经到期但没有正常执行。
7. 手动执行当前已到期的任务
可以执行:
wp cron event run --due-now
root 用户:
wp cron event run --due-now --allow-root
该命令会运行当前已经到期的 Cron 事件。
正常情况下可能看到:
Executed the cron event 'wp_version_check'
Executed the cron event 'publish_future_post'
Success: Executed a total of 2 cron events.
如果手动执行成功,但 WordPress 平时不会自动执行,通常说明:
任务本身可以运行,但自动触发机制存在问题。
接下来应该重点检查回环请求或 DISABLE_WP_CRON。
8. 单独执行指定的 Cron Hook
如果只想测试某一个 Hook,可以先找到它的名称。
例如:
wp cron event list --allow-root
然后执行:
wp cron event run Hook名称 --allow-root
例如:
wp cron event run wp_version_check --allow-root
不要随意运行不了解用途的插件任务。
部分任务可能会:
- 发送邮件
- 执行备份
- 清理数据
- 同步订单
- 调用第三方接口
- 生成大量文件
正式网站操作前,应先确认 Hook 的实际作用。
9. 检查 DISABLE_WP_CRON
打开:
wp-config.php
搜索:
grep -n "DISABLE_WP_CRON" wp-config.php
如果看到:
define( 'DISABLE_WP_CRON', true );
说明 WordPress 默认的访客触发 Cron 已经被关闭。
这不一定是错误。
很多正式网站会主动关闭默认 WP-Cron,再通过 Linux 系统 Cron 定期执行。
但如果关闭 WP-Cron 后,又没有设置系统 Cron,计划任务就不会自动运行。
如果没有配置系统任务,不应只保留:
define( 'DISABLE_WP_CRON', true );
10. wp cron test 提示 WP-Cron 已禁用
如果设置了:
define( 'DISABLE_WP_CRON', true );
再执行:
wp cron test
可能会提示 WP-Cron 已禁用。
这种情况并不一定代表任务系统损坏。
因为该命令测试的是 WordPress 默认的 Cron 启动机制,而当前站点已经主动关闭了它。
此时应该继续确认:
Linux 系统 Cron 是否已经正确配置。
11. 检查系统 Cron 是否存在

查看当前用户的定时任务:
crontab -l
如果使用的是网站用户,还要切换到对应用户后检查。
例如:
crontab -u www -l
如果没有任何任务,而 wp-config.php 又设置了:
define( 'DISABLE_WP_CRON', true );
那么 WP-Cron 很可能没有任何自动触发来源。
12. 使用系统 Cron 调用 wp-cron.php
可以编辑系统 Cron:
crontab -e
加入:
*/5 * * * * curl -fsS "https://example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
将:
example.com
替换成实际网站域名。
这条任务表示:
每 5 分钟请求一次 wp-cron.php。
如果服务器没有安装 curl,也可以根据实际环境使用 wget:
*/5 * * * * wget -q --delete-after "https://example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
配置完成后查看:
crontab -l
确认任务已经保存。
13. 使用 WP-CLI 作为系统 Cron
如果网站服务器已经安装 WP-CLI,也可以直接通过系统 Cron 执行到期任务。
例如:
*/5 * * * * cd /www/wwwroot/example.com && /usr/local/bin/wp cron event run --due-now --quiet --allow-root
需要根据实际环境修改:
- WordPress 路径
- WP-CLI 路径
- 运行用户
- 是否需要
--allow-root
查看 WP-CLI 实际路径:
which wp
例如输出:
/usr/local/bin/wp
如果可以,正式网站更建议使用网站所属用户运行任务,而不是长期使用 root。
14. 系统 Cron 应该多久执行一次?
普通网站可以考虑:
每 5 分钟
或者:
每 10 分钟
执行一次。
例如:
*/5 * * * * 命令
表示每 5 分钟运行一次。
如果站点存在对时间要求较高的任务,例如:
- 计划文章
- 订单状态处理
- 定时邮件
- 队列任务
- 备份任务
可以根据业务需要设置更合适的间隔。
不建议在不了解网站任务量的情况下每分钟执行大量耗时任务。
15. 检查 wp-cron.php 是否可以访问
可以在服务器上执行:
curl -I "https://example.com/wp-cron.php?doing_wp_cron"
如果返回:
HTTP/2 200
通常说明该地址可以访问。
如果返回:
403 Forbidden
可能被以下配置阻止:
- Nginx 或 Apache 规则
- CDN
- WAF
- 防火墙
- 安全插件
- Basic Auth
- IP 白名单
如果返回:
404 Not Found
需要确认:
- 域名是否指向正确网站
- WordPress 路径是否正确
wp-cron.php是否存在- Nginx 网站根目录是否正确
16. 什么是 WordPress 回环请求?

回环请求是指:
WordPress 服务器向自己的网站地址发起请求。
WP-Cron 默认需要通过回环请求启动 wp-cron.php。
站点健康中的以下问题,也可能和回环请求有关:
您的站点无法完成回环请求
如果回环请求失败,可能影响:
- WP-Cron
- 计划文章
- 插件定时任务
- 主题或插件编辑检查
- 其他依赖 WordPress HTTP API 的功能
17. 在站点健康中检查回环请求
登录 WordPress 后台,进入:
工具 → 站点健康 → 状态
查看是否存在:
您的站点无法完成回环请求
如果有相关错误,应记录具体提示。
常见错误包括:
cURL error 6
表示域名解析失败。
cURL error 7
表示无法连接目标地址或端口。
cURL error 28
表示请求超时。
403
表示请求被拒绝。
不同错误对应的排查方向不同。
18. 回环请求 403 怎么排查?
如果执行:
wp cron test --allow-root
提示 HTTP 403,可以继续执行:
curl -I https://example.com/wp-cron.php
如果仍然返回 403,重点检查:
- CDN 安全规则
- WAF
- Nginx deny 规则
- Apache 访问控制
- WordPress 安全插件
- Basic Auth
- IP 白名单
- 防盗链配置
如果公网域名经过 CDN,而源站本机访问会被拦截,可以继续测试源站回环。
例如:
curl -I http://127.0.0.1/wp-cron.php \
-H "Host: example.com"
如果本机 Host 测试正常,而公网域名返回 403,问题通常位于 CDN、WAF 或公网代理层。
19. 回环请求 DNS 解析失败怎么办?
首先检查域名解析:
getent hosts example.com
或者:
dig example.com
确认域名解析到了正确服务器。
如果服务器无法解析自己的域名,可以检查:
cat /etc/resolv.conf
如果域名刚刚修改解析,也可能存在 DNS 缓存或传播延迟。
不要在不了解服务器网络结构的情况下随意修改 /etc/hosts。
只有明确知道域名应该指向哪个地址时,才考虑临时增加主机解析进行测试。
20. HTTPS 证书会影响 WP-Cron 吗?
会。
如果 WordPress 网站使用 HTTPS,但证书存在:
- 过期
- 域名不匹配
- 证书链不完整
- TLS 配置异常
服务器向自己发起 HTTPS 回环请求时可能失败。
可以检查:
curl -Iv https://example.com/wp-cron.php
重点查看:
- SSL certificate problem
- certificate expired
- unable to get local issuer certificate
- hostname mismatch
应该修复 HTTPS 证书本身,而不是长期关闭证书验证。
21. Basic Auth 会阻止 WP-Cron 吗?
测试站、开发站或后台可能配置了 HTTP Basic Auth。
如果服务器访问:
https://example.com/wp-cron.php
时也需要输入用户名和密码,WordPress 回环请求可能被拦截。
可以测试:
curl -I https://example.com/wp-cron.php
如果返回:
401 Unauthorized
说明请求需要认证。
这时可以:
- 调整 Basic Auth 规则
- 为
wp-cron.php配置例外 - 使用带认证信息的系统 Cron
- 使用本地 WP-CLI 执行任务
不要把 Basic Auth 账号密码直接写进公开文章或不安全脚本。
22. 防火墙和安全组会影响回环请求吗?
有可能。
例如服务器访问自己的公网 IP 或域名时,需要经过:
- 本地路由
- 云平台网络
- 防火墙
- CDN
- WAF
- 反向代理
如果其中任何一层阻止请求,回环就可能失败。
可以分别测试:
curl -I https://example.com/wp-cron.php
和:
curl -I http://127.0.0.1/wp-cron.php \
-H "Host: example.com"
通过结果对比,判断问题发生在本机 Web 服务还是公网链路。
23. 缓存插件会影响 WP-Cron 吗?
部分缓存、安全或优化插件可能影响:
- 回环请求
- WordPress HTTP API
wp-cron.php- REST API
- 登录验证
如果问题发生在安装或更新某个插件以后,可以先做好备份,然后:
- 暂时停用最近变更的插件。
- 重新运行
wp cron test。 - 逐个恢复插件。
- 找出发生冲突的插件。
不要在正式网站中一次性删除全部插件。
可以先在维护时间内进行排查。
24. 主题也可能造成回环请求失败吗?
可能。
某些主题会在 WordPress 加载期间执行额外代码。
如果主题代码出现:
- Fatal Error
- 无限循环
- 外部请求超时
- 数据库异常
也可能影响 WP-Cron。
可以在测试环境临时切换到 WordPress 默认主题进行对比。
正式网站切换主题可能影响页面显示,应先做好备份并选择合适时间操作。
25. PHP Fatal Error 会导致 Cron 不执行
查看 WordPress 调试日志:
wp-content/debug.log
如果已经开启日志,可以执行:
tail -n 100 wp-content/debug.log
也可以查看 PHP-FPM 日志。
例如:
journalctl -u php8.2-fpm -n 100 --no-pager
实际 PHP 版本需要根据服务器环境修改。
如果某个 Cron Hook 执行时触发 Fatal Error,任务可能每次都失败。
这时应该先修复具体插件或主题错误。
26. 检查 PHP 最大执行时间
部分备份、同步和邮件任务运行时间较长。
如果 PHP 限制过低,任务可能在完成前被终止。
可以查看:
php -i | grep max_execution_time
不过,网站使用的 PHP-FPM 配置可能和命令行 PHP 不同。
还需要检查实际 Web 环境中的:
max_execution_time
memory_limit
不要只为了让任务完成就无限增加 PHP 资源限制。
应该先确认任务本身是否存在异常或死循环。
27. 检查服务器内存和磁盘空间
服务器资源不足也可能导致定时任务失败。
查看内存:
free -h
检查磁盘:
df -h
检查 inode:
df -i
如果磁盘已经达到 100%,WordPress 可能无法:
- 写入缓存
- 生成备份
- 创建临时文件
- 更新数据库
- 保存日志
如果内存不足,PHP-FPM 进程也可能被系统终止。
28. 计划文章显示“错过计划”怎么办?
先检查文章状态:
wp post list \
--post_status=future \
--fields=ID,post_title,post_date \
--allow-root
然后查看是否存在:
publish_future_post
任务:
wp cron event list \
--fields=hook,next_run_relative,args \
--allow-root
如果 Cron 系统恢复后,可以执行:
wp cron event run --due-now --allow-root
然后再次检查计划文章是否已经发布。
不要直接修改大量文章的数据库时间。
29. 插件 Cron 任务堆积怎么办?
执行:
wp cron event list --allow-root
如果发现大量相同 Hook,可能是:
- 插件重复注册任务
- 插件停用时没有清理任务
- 任务每次执行失败
- Cron 长期没有正常运行
不要直接执行:
wp cron event delete --all
这会删除全部计划任务,可能影响 WordPress 和其他插件。
应该先确认具体 Hook 属于哪个插件,再决定是否删除、修复或重新注册。
30. WooCommerce 任务和 WP-Cron 是一回事吗?
WooCommerce 及部分插件会使用自己的计划任务管理机制,例如 Action Scheduler。
它们可能仍然依赖 WP-Cron 触发,但后台界面和任务队列与普通 WP-Cron 事件不同。
如果 WooCommerce 订单、邮件或后台任务异常,还需要进入:
WooCommerce → 状态 → 计划操作
查看是否存在:
- 失败
- 待处理
- 过期
- 长时间运行中
不要只查看 wp cron event list 就认为所有插件队列都正常。
31. 使用系统 Cron 后是否还需要 DISABLE_WP_CRON?
如果已经设置可靠的系统 Cron,可以在:
wp-config.php
中加入:
define( 'DISABLE_WP_CRON', true );
这样可以避免每次访问页面都尝试触发 WP-Cron。
但必须确保系统 Cron 已经正常工作。
正确顺序建议是:
- 先配置系统 Cron。
- 手动测试系统 Cron。
- 确认任务可以正常执行。
- 最后再设置
DISABLE_WP_CRON。
不要先关闭 WP-Cron,然后忘记配置替代任务。
32. 如何确认系统 Cron 真的执行了?
可以暂时把输出写入日志文件。
例如:
*/5 * * * * cd /www/wwwroot/example.com && /usr/local/bin/wp cron event run --due-now --allow-root >> /tmp/wp-cron.log 2>&1
等待几分钟后查看:
tail -n 100 /tmp/wp-cron.log
确认任务确实被执行。
验证完成后,可以根据实际需要调整日志策略,避免日志文件无限增长。
33. 多站点怎么执行 Cron?
WordPress Multisite 需要指定具体站点或使用网络参数。
例如:
wp cron event run --due-now \
--url=https://site.example.com \
--allow-root
如果需要跨所有站点执行,并且当前 WP-CLI 命令支持,可以使用对应的网络选项。
多站点环境中不要只在主站执行后,就默认所有子站任务都已经完成。
34. WP-Cron 快速排查顺序
建议按照下面的顺序排查:
第一步:进入正确网站目录
cd /www/wwwroot/example.com
第二步:测试 Cron 启动机制
wp cron test --allow-root
第三步:查看任务列表
wp cron event list --allow-root
第四步:执行到期任务
wp cron event run --due-now --allow-root
第五步:检查 wp-config.php
grep -n "DISABLE_WP_CRON" wp-config.php
第六步:检查系统 Cron
crontab -l
第七步:测试 wp-cron.php
curl -I "https://example.com/wp-cron.php?doing_wp_cron"
第八步:检查站点健康回环请求
工具 → 站点健康
第九步:检查插件、主题和 PHP 错误
tail -n 100 wp-content/debug.log
35. 常见问题对照表
| 问题现象 | 优先检查 |
|---|---|
| 计划文章不发布 | publish_future_post、WP-Cron |
| wp cron test 成功 | Cron 启动机制基本正常 |
| wp cron test 提示禁用 | DISABLE_WP_CRON |
| 手动运行成功,自动不执行 | 回环请求或系统 Cron |
| 返回 403 | WAF、防火墙、安全插件 |
| 返回 401 | Basic Auth |
| cURL error 6 | DNS 解析 |
| cURL error 7 | 连接或端口 |
| cURL error 28 | 请求超时 |
| 插件任务大量堆积 | 插件 Hook 或任务执行失败 |
| 低流量网站任务延迟 | 使用系统 Cron |
| 系统 Cron 不执行 | 路径、用户、权限、命令 |
36. 搭建 WordPress 的服务器建议
如果 WordPress 同时运行:
- WooCommerce
- 自动备份
- 邮件任务
- 缓存预热
- 数据同步
- 多个定时插件
需要考虑:
- PHP-FPM 进程
- MySQL 性能
- 内存
- 磁盘 I/O
- Cron 任务运行时间
如果需要搭建 WordPress 网站,可以根据访问量和插件数量选择莱卡云 Linux 云服务器。
查看官网购买链接: https://www.lcayun.com
如果站点回环请求因端口或防火墙无法访问,可以继续参考:
相关阅读: 云服务器端口不通怎么办?
37. 总结
WordPress WP-Cron 不执行时,首先执行:
wp cron test --allow-root
确认 WP-Cron 启动机制是否正常。
然后查看当前计划任务:
wp cron event list --allow-root
手动执行已经到期的任务:
wp cron event run --due-now --allow-root
如果手动执行成功,但自动任务仍然不运行,应重点检查:
DISABLE_WP_CRON- 系统 Cron
- 回环请求
- CDN/WAF
- Basic Auth
- DNS
- HTTPS
- 插件或主题冲突
对于访问量较低或对任务时间要求较高的网站,可以使用 Linux 系统 Cron 定期调用:
wp-cron.php
或者直接执行:
wp cron event run --due-now
配置系统 Cron 后,再根据需要关闭 WordPress 默认的访客触发机制。
正确排查顺序是:
任务列表 → 手动执行 → WP-Cron 测试 → DISABLE_WP_CRON → 系统 Cron → 回环请求 → 插件与服务器资源。








