注册 book 类型时 rewrite slug 写成 books,站里正好有个页面别名也是 books,访问 /books/ 打开的是页面,/books/某本书/ 直接 404。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
register_post_type('book', [
'has_archive' => true,
'rewrite' => ['slug' => 'library'],
]);
flush_rewrite_rules();
页面和自定义文章类型抢同一个 rewrite 前缀,WordPress 先匹配到页面规则,后面的类型规则就轮不到。重写规则按注册顺序写入,冲突时先注册的赢。这一点先确认清楚,后面就不用反复试。
「rewrite slug 冲突」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
具体做法是,换一个不重复的 slug,比如 library,避开现有页面和分类的别名;改完到设置里的固定链接页保存一次,重建重写规则;用 get_post_type_archive_link 生成链接,别在模板里手写路径。
改完照着核一遍,/library/ 打开书籍归档,单本链接也能正常访问,不再 404。
