由于 WordPress 社区中无人能够找出的原因,定时发布的文章有时无法显示。
在 WordPress 中,这会显示为“错过发布计划”。遗憾的是,一旦错过发布计划,文章就会进入待发布状态。管理员必须手动发布或重新安排文章的发布时间。
在网站上,这种情况通常每隔几个月就会发生一次。上周就发生了一次,当我准备在ZHUJIMAO.COM论坛上提及此事时,却发现它根本没有发布。没有任何预警。
造成这种情况的原因是什么?很可能是某种完美风暴。
WordPress 的虚假定时任务是如何工作的
WordPress 没有运行守护进程,所以没有像“crond”这样的任务在后台运行来检查文章是否到期。相反,每当有人访问你的网站时,WordPress 都会检查是否有文章到期,并迅速发布。这很合理——有点像“如果森林里有一棵树倒了,周围没有人,它会发出声音吗?”的场景。如果你安排了一篇文章在下午 1 点发布,但直到下午 3 点才有人访问,这重要吗?当第一个下午 3 点的访客访问时,文章就会显示出来,时间戳显示为下午 1 点。
为什么 WordPress 的模拟定时任务有时会失效
我的研究发现,这种方法有时会失效的原因尚不完全清楚。我通过谷歌搜索发现,可能的原因有以下几点:
- 缓存
- 处理资源不足
- 干扰插件
- 主机操作系统限制
……或者说是所有这些因素共同作用的结果。根据网站的经验,这种情况并不稳定。
我的猜测是,在我们这种情况下,问题出在发布文章时伴随而来的各种操作上。如果你的 WordPress 网站完全是通用的,那么将文章状态从“已安排”更改为“已发布”只不过是更新数据库中的一个字段。但对我们来说,这还意味着更新站点地图、将各种社交网络通知加入队列等等。我怀疑当访客访问网站时,WordPress 会执行所有这些操作,但其中某个环节超时,导致文章最终无法发布。
如何修复它
一种方法是安装一个专门解决此问题的插件,但谁还需要更多的 WordPress 插件呢?这类插件确实存在。WP Crontrol就是其中之一,但我还没有深入研究过它。
更好的解决方案是放弃 WordPress 的虚拟定时任务,而使用真正的定时任务来运行作业。这需要两个步骤:
(1)禁用 WordPress 定时任务。编辑 wp-config.php 文件并添加以下内容:
定义( 'DISABLE_WP_CRON' , true );
请重新加载您的网站(即,在您的网络浏览器中访问它),以确保您没有输入任何错误信息。
(2)登录到您的 WordPress 服务器,并按如下方式编辑 Web 用户的 crontab:
*/5 * * * * /bin/wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
将“example.com”替换为您自己的域名。
该任务每 5 分钟触发一次,并将发布所有到期/逾期的内容。
这种语法会将所有错误发送到空设备(/dev/null)。如果您希望接收错误信息,请按如下方式修改:
[email protected]
*/5 * * * * /bin/wget -q -O - https://example.com/wp-cron.php?doing_wp_cron
Cron 会将所有输出发送到 MAILTO 行中指定的地址。