文章设了今天九点发布,十点半前台还是打不开,后台状态栏写着「定时」。查 wp_posts 发现 post_status 是 future,post_date_gmt 却是 0000-00-00 00:00:00。乍看像缓存或者权限的锅,追下去往往不是。
SELECT ID, post_title, post_date, post_date_gmt FROM wp_posts WHERE post_status = 'future' AND post_date_gmt = '0000-00-00 00:00:00';
追下去是这么回事:发布判定只看 post_date_gmt 和当前 GMT 时间的比较,这一列空着就永远排不到期。用脚本直接写 wp_posts,或者迁移时只搬了 post_date,GMT 那一列不会被自动补上。
「post_date_gmt 为空」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
同一份配置存在多处的,先确认改的是被加载的那一份。
具体做法是,先在 wp_posts 里筛出 post_status 为 future 且 post_date_gmt 是零值的记录,确认范围;用 wp_update_post 重新保存一遍,让 WordPress 按站点时区重算 GMT 时间,别手写;保存后确认 post_date_gmt 早于当前 UTC 时间,再手动跑一次 publish_future_post 事件。
验收就看一点,刷新后文章状态从 future 变成 publish,前台链接能正常打开。
