本文约 2,008 字,预计阅读 6 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
写好了文章,设置成明天早上八点定时发布,结果到了时间刷新一看,状态还停在「已计划」,文章根本没上架;有时甚至过了好几天才突然冒出来,时间完全对不上。这个毛病在新建的、访问量还很小的小站上特别常见,站长们往往以为是时区设错了,改来改去却不见效,随后开始怀疑主题或插件,白白浪费大量时间。实际上,WordPress 的定时发布由两个环节共同决定:一是「设置 → 常规」里的时区是否正确,二是负责触发任务的 WP-Cron 机制有没有正常运行。这两者一个管「几点发」,一个管「由谁来触发发布」,缺一不可。搞清楚它们的关系,问题就好解决了。另外要提醒一点,定时发布本身允许几分钟到几十分钟的误差,这属于 WordPress 的正常行为,不必追求分秒不差。
故障原因分析
- 时区选错。若时区被设成 UTC 或与所在地不符,你定的「早上八点」会按错误时区解析,导致发布时间偏离甚至被当成过去时间,任务卡住不执行。
- WP-Cron 依赖访问触发。WordPress 的定时任务不是服务器级的计划任务,而是靠有人访问网站时才被唤醒执行,小站无人访问就一直不触发。
- 服务器系统时间错误。系统时钟不准,会让任务判断「还没到时间」或「已经过期」,怎么等都发不出来。
- 缓存或静态化阻断。全站静态缓存让
wp-cron.php请求被拦截,任务无法运行。 - 插件冲突或任务被禁用。某些优化插件直接禁用了 WP-Cron,却忘了配置系统级计划任务。
- 把「已发布」的文章改回定时却设成了过去时间,WordPress 会一直显示「已错过时间表」。
分步解决方案
方法一:校正时区设置(首要)。 进入「后台 → 设置 → 常规」,在「时区」里选择「上海」,或直接选 UTC+8。保存后,再看文章编辑页的发布时间是否与你预期一致。这一步能修正绝大多数「时间对不上」的问题。改完顺手把那些已错过时间表的文章重新排一次期,让状态刷新。
方法二:确认服务器系统时间。 有 SSH 权限时执行:
date
若输出时间明显不对,请让主机商同步 NTP,或自行校对系统时钟。服务器时间错了,任何时区设置都白搭。
方法三:手动触发一次 WP-Cron 验证机制。 访问下面地址,能让 WordPress 立即跑一遍到期的定时任务:
https://www.example.com/wp-cron.php?doing_wp_cron
访问后回到文章列表刷新,看定时文章是否发布。如果这样能发出来,说明时区没问题,问题出在 WP-Cron 触发频率上。
方法四:改用系统级计划任务(推荐给低访问量站点)。 先在 wp-config.php 中关闭内置触发:
define('DISABLE_WP_CRON', true);
再在服务器上配置系统 cron(Linux 示例,每 5 分钟触发一次):
*/5 * * * * wget -q -O - "https://www.example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
宝塔面板可在「计划任务」里新建「访问 URL」类型任务,地址填上面的 wp-cron 链接,频率设为每 5 分钟,这样即使无人访问也会准时触发,再也不用担心小站访问少而错过发布时间。
方法五:用 WP-CLI 或插件排查定时任务。 有命令行时执行:
wp cron event list
wp cron event run --due-now
也可以在后台安装「WP Crontrol」插件,直观查看有哪些定时事件、下次执行时间,并手动立即执行,快速定位是不是任务本身丢了。
常见踩坑点
- 时区设成 UTC 却按本地时间定发布点,文章早了或晚了几个小时。
- 以为 WordPress 定时发布是精确到秒,其实受 WP-Cron 触发影响,通常有几十分钟误差。
- 关闭了内置 WP-Cron 却没配系统计划任务,定时文章永远不发。
- 缓存主机屏蔽了
wp-cron.php,导致任务请求被丢弃。 - 系统时间不准,改时区也没用。
- 用「已发布」改回「定时」时,误把它设成了过去时间,WordPress 会卡在计划状态不执行。
- 装了缓存插件后未排除 wp-cron 路径,任务被缓存挡下。
总结
WordPress 定时文章不发布,根子在「时区」和「WP-Cron 触发」两件事上。先把「设置 → 常规」的时区改为上海(UTC+8),再确认服务器系统时间正确,然后通过访问 wp-cron.php 或运行 wp cron event run --due-now 验证机制是否正常。低访问量的站点最好关掉内置触发、改用系统计划任务,才能保证准时发布。按这个思路排查,WordPress 定时文章不发布的问题基本都能解决,定时发布也能重新变得可靠,不必再每天守着时间手动刷新。
