12k
All articles

如何在 WordPress 中定时发布文章

在WordPress中安排文章,修复Missed Schedule,并用真实服务器cron设置WP-Cron,确保帖子按时发布。

OpenReplay Team
OpenReplay Team
如何在 WordPress 中定时发布文章

要在 WordPress 中定时发布文章,请打开文章的 Settings → Summary(设置 → 摘要) 面板,点击 Publish: Immediately(立即发布) 日期,选择一个未来的日期和时间,然后点击取代 PublishSchedule(计划) 按钮。

这一步不到一分钟就能完成。真正耗时的,是弄清楚为什么你排定在凌晨 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 也会让你回头再确认一次。

如何在区块编辑器中定时发布文章?

要在区块编辑器中定时发布文章,请打开 Settings → Summary 面板,点击 Publish: Immediately 日期,选择未来的日期和时间,然后点击取代 PublishSchedule 按钮。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。

DevTools for the frontend

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

We use cookies to improve your experience. By using our site, you accept cookies.