要在 WordPress 中定时发布文章,请打开文章的 Settings → Summary(设置 → 摘要) 面板,点击 Publish: Immediately(立即发布) 日期,选择一个未来的日期和时间,然后点击取代 Publish 的 Schedule(计划) 按钮。
这一步不到一分钟就能完成。真正耗时的,是弄清楚为什么你排定在凌晨 2 点发布的文章,到早餐时间还静静躺在那里,被标上了红色的 Missed Schedule(错过计划)。
原因要追溯到 WordPress 运行定时任务的方式:它并不依赖真正的定时器,而是依赖页面加载。本文先介绍最快的点击路径,再讲解 WP-Cron 机制,以及能够彻底解决”错过计划”问题的服务器级 cron 方案。
核心要点
- WordPress 按站点时区来定时发布文章,而该时区默认为 UTC。在定时发布之前,请先在 Settings → General(设置 → 常规) 中设置正确的时区,否则文章会在错误的本地时间发布。
- WordPress 并不使用真正的系统定时器,而是使用 WP-Cron —— 一种伪 cron,只有当有人加载页面时才会检查到期任务。因此低流量站点或高度缓存的站点可能会完全错过预定时刻。
- 彻底的解决办法是运行真正的服务器 cron,每 5–15 分钟请求一次
wp-cron.php,然后在wp-config.php中加入define('DISABLE_WP_CRON', true);。务必按这个顺序操作,否则定时任务会在无声无息中停止运行。 - 像 MWW Scheduled Post Trigger 这类插件只会在文章已经逾期之后才补发;而服务器 cron 从根本上避免了错过的发生。
- Kinsta 和 DreamHost 的 DreamPress 等托管平台已经在服务器层面运行 cron(通常每 15 分钟一次),因此在这些平台上通常无需额外配置。
先设置好时区
WordPress 按站点时区来定时发布文章,而该时区默认为 UTC。在定时发布之前,请先在 Settings → General 中设置正确的时区,否则文章会在错误的本地时间发布。全新安装的 WordPress 以协调世界时(UTC)存储时间,所以你排定在”8:00 AM”发布的文章,实际会在 UTC 时间 8:00 触发——除非你告诉 WordPress 你所在的位置。进入 Settings → General,选择你所在时区的某个城市(与固定 UTC 偏移不同,基于城市的条目会自动处理夏令时),然后保存。这件事只需在排定任何内容之前做一次。MWW Scheduled Post Trigger 插件的安装说明就要求你首先检查这项设置,而当文章仍未按时出现时,它的 FAQ 也会让你回头再确认一次。
Discover how at OpenReplay.com.
如何在区块编辑器中定时发布文章?
要在区块编辑器中定时发布文章,请打开 Settings → Summary 面板,点击 Publish: Immediately 日期,选择未来的日期和时间,然后点击取代 Publish 的 Schedule 按钮。WordPress 会在该时刻自动发布文章。要确认是否生效:只要设置了未来日期,顶部按钮就会显示为 Schedule 而非 Publish。
经典编辑器: 在 Publish 元框中,点击 Publish immediately 旁边的 Edit,输入日期和时间,点击 OK,然后点击 Schedule 按钮。
页面(Page)的操作方式相同。两种内容类型的日期控件都位于同一个面板中。
管理、取消排期与提前发布
要查看所有排队中的文章,进入 Posts → All Posts(文章 → 所有文章),点击列表上方的 Scheduled(已计划) 筛选项;在那里你可以编辑、提前发布或取消任意条目的排期。
- 提前发布: 打开文章并点击 Publish。无论预定时间为何,文章都会立即上线。
- 取消排期: 将文章状态改回 Draft(草稿)。这样可以将其从队列中移除而不发布,之后你可以继续编辑并重新排期。(把日期设为”现在”再点击 Publish 属于提前发布,而不是取消排期。)
- 为已发布文章排定修改: 默认情况下无法做到,因为对已上线文章的任何改动会在保存的那一刻立即公开。要把更新排入队列,可使用 PublishPress Revisions 之类的插件,它会暂存一个修订版本并按计划发布。
为什么 WordPress 的定时文章会错过?
WordPress 并不使用真正的系统定时器。它使用 WP-Cron —— 一种伪 cron,只有当有人加载页面时才会检查到期任务。因此在低流量站点上,排定在凌晨 2:00 发布的文章可能要等到下一位访客到来时才会发布。《插件开发手册》对此毫不讳言:把任务排在下午两点,而直到五点才有访客,那么这个任务就会一直干等到五点。当触发终于发生时,文章已经逾期,WordPress 会把它标为红色的 Missed Schedule。
有两种生产环境条件会让情况更糟:
- 低流量或零流量。 正如 SpinupWP 所解释的,定时事件只在有人访问时才会触发,因此一个连续数小时无人访问的站点会错过该时段内所有到期任务。业余博客的夜间发文就是最典型的受害者。
- 激进的整页缓存。 缓存页面以静态 HTML 形式提供,不执行 PHP,因此 WP-Cron 根本不会运行。如果你有足够比例的流量由缓存提供,WordPress 就几乎不会被执行,这意味着即使是繁忙站点也可能停止触发定时事件。这在做过性能优化的站点上是常见原因。
彻底方案:禁用伪 cron,运行真正的服务器 cron
彻底的解决办法是按固定时间间隔运行真正的 cron,然后禁用页面加载触发机制。这是官方文档记载的做法,而非取巧手段:《插件开发手册》专门讲解了如何将 WP-Cron 挂接到系统任务调度器,正是针对任务必须准时执行的场景。
请按顺序执行以下步骤。如果在替代方案就位之前就禁用 WP-Cron,定时任务会停止触发,且没有任何报错或警告:文章、备份和更新检查都会陷入沉默,直到你自己发现。
第 1 步:添加真正的 cron 任务。 在 cPanel 的 Cron Jobs 模块或服务器的 crontab 中,按一定间隔请求 wp-cron.php。可靠的默认值是每 5–15 分钟一次。下面这种 wget -q -O - 写法来自 Kinsta:
*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
*/15 表示每 15 分钟运行一次;请将 example.com 替换为你自己的域名。手册中给出的标准写法是在相同间隔下使用 wget --delete-after http://YOUR_SITE_URL/wp-cron.php。两者都可行,选择你的主机支持的那一种即可。
第 2 步:禁用页面加载触发机制。 服务器 cron 就位后,在 wp-config.php 中 /* That's all, stop editing! */ 注释上方加入这一行:
define('DISABLE_WP_CRON', true);
插件只是权宜之计。 像 MWW Scheduled Post Trigger 或 Missed Scheduled Posts Publisher 这类插件,只会在文章已经逾期之后才补发;MWW 自己的 FAQ 也把它描述为一种过渡手段,用于在你和主机商查明 cron 为何不触发之前顶一阵。真正的服务器 cron 是预防错过,而不是事后补救。不要把任何单一插件当作万无一失的保障,因为有些插件在特定主机配置下会失效。
| 权宜插件 | 真正的服务器 cron(推荐) | |
|---|---|---|
| 作用 | 在下一次访问/间隔时发布已经错过的文章 | 按固定定时器触发 wp-cron.php,与流量无关 |
| 适用场景 | 低流量业余博客、快速解困 | 生产环境、有缓存、低流量或多站点(multisite)安装 |
| 能否预防错过? | 不能,属事后反应 | 能,属主动预防 |
| 配置方式 | 安装并启用 | 编辑 wp-config.php + 添加 cron 条目(或使用托管主机) |
托管主机。 Kinsta 为每个站点在服务器层面每 15 分钟运行一次 cron,而 DreamHost 的 DreamPress 默认禁用 WP-Cron,并以相同间隔的系统 cron 取而代之。在这类平台上,你通常无需做任何配置。在禁用 WP-Cron 之前,请先查阅主机商的文档。
用 WP-CLI 验证与强制运行。 在具备 SSH 的服务器上,wp cron event list 会列出定时事件及其下次运行时间,而 wp cron event run --due-now 会立即强制执行所有逾期事件——这是确认卡住的文章能否发布的最快方式。
小结
定时发布 WordPress 文章只是一分钟的点击操作,但要让这些定时发布可靠运行,则是服务器层面的问题。在 Settings → General 中设置好时区,并从 Summary 面板排定文章。如果定时文章出现 Missed Schedule,就不要再依赖页面加载式的伪 cron:让真正的服务器 cron 每 5–15 分钟请求一次 wp-cron.php,然后加上 define('DISABLE_WP_CRON', true);。仅此一项改动,就能把”尽力而为”的定时发布变成可靠机制——即使在冷清或高度缓存的站点上也是如此。
常见问题
如果我使用 Kinsta 或 DreamHost 这类 WordPress 托管主机,还需要禁用 WP-Cron 吗?
不需要。在 Kinsta 和 DreamHost 的 DreamPress 等托管平台上,你通常不必自己禁用 WP-Cron,因为这些平台已经在其服务器端运行了服务器级 cron(通常每 15 分钟一次),无论流量如何都会触发 wp-cron.php。请先查阅主机商的文档——许多托管套餐会自动完成这项配置,重复设置也不会带来额外好处。只有在主机商确认其未运行服务器 cron 时,才去改动 wp-config.php。
错过计划类插件与真正的服务器 cron 有什么区别?
像 MWW Scheduled Post Trigger 或 Missed Scheduled Posts Publisher 这类错过计划类插件,只会在文章已经逾期之后才发布,依靠下一次页面加载或间隔来触发;而真正的服务器 cron 会按固定定时器触发 wp-cron.php,与流量无关,从根本上防止错过发生。插件适合低流量业余博客作为快速过渡手段;服务器 cron 才是生产环境、有缓存或多站点安装的主动解决方案。
为什么我的定时文章在错误的时间发布了?
全新安装的 WordPress 以协调世界时(UTC)存储时间,因此排定在“8:00 AM”的文章会在 UTC 时间 8:00 触发,除非你在 Settings 然后 General 中设置了时区。请选择基于城市的条目而不是固定的 UTC 偏移,因为城市条目会自动适配夏令时。在排定任何内容之前设置一次,就能让此后所有文章都按你的本地时间发布。
我该如何确认定时文章是否真的会发布?
在具备 SSH 访问权限的服务器上,运行 wp cron event list 可查看每个定时事件及其下次运行时间,再运行 wp cron event run --due-now 可强制立即执行所有逾期事件。这一对 WP-CLI 命令是确认卡住的文章能否发布、以及诊断 WP-Cron 是否在触发的最快方式。如果没有 SSH,WP Crontrol 插件可以在后台仪表盘中展示同样的事件列表。
整页缓存会导致定时文章错过发布吗?
会。激进的整页缓存是导致错过计划的常见且经常被忽视的原因。缓存页面以静态 HTML 形式提供,不执行 PHP,因此即使流量很高,WP-Cron 在这些请求上也不会运行。如果你有足够比例的流量由缓存提供,WordPress 就几乎不会被执行,定时事件也就停止触发。解决办法与低流量站点相同:禁用页面加载触发机制,运行真正的服务器 cron。
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.
Star on GitHub12k