图书列表显示 214 条,前台只有 118 条,多出来的 96 条全是草稿,列表顶部也没显示“草稿”筛选。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

add_action('pre_get_posts', function ($q) {
    if (!is_admin() || $q->get('post_type') !== 'book') return;
    $q->set('post_status', 'publish');
});

注册 post_type 时 public 为 true,但列表查询没有限定 post_status。pre_get_posts 也没判断 post_type,把所有状态都查了出来。这一点先确认清楚,后面就不用反复试。

碰到「自定义文章类型列表状态」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

具体做法是,在 pre_get_posts 里判断 post_type 是否为 book;把 post_status 设成 publish;保留全部与草稿视图的入口 方便编辑。

改完照着核一遍,默认列表显示 118 条,点“草稿”能单独看到 96 条,数量对得上。

作者 9823189