文章状态是 future,时间早就过了,前台还是打不开。手动跑 wp cron event run publish_future_post 才转成 publish,日志里调度函数返回 false。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,同一个 hook 带相同参数重复注册时,wp_schedule_single_event 会直接返回 false,不覆盖旧事件。发布时间改过一次,旧事件还挂在原处,新时间根本没排进去。

「定时事件调度失败」这类改动最怕改一半,回滚脚本先准备好,再动生产。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

wp cron event list --fields=hook,next_run_relative,args --format=table
wp cron event run publish_future_post

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

具体做法是,先列出该文章相关的定时事件,确认是不是还挂在旧时间;用 wp_unschedule_event 清掉旧的那条,再按新时间重排;手动触发一次 publish_future_post,确认文章能转状态;把发布时间改动后的重排逻辑写进保存钩子。

最后用这个标准收尾,事件列表里只剩一条对应新时间的记录,文章到点自动变成 publish。

作者 9823189