访问 news.example.com/sitemap.xml,里面 1200 条 URL 全部指向 www.example.com,子站文章一条都没有。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

switch_to_blog(2);
do_action('wp_sitemaps_init');
restore_current_blog();
// 清缓存后重新访问 /news/sitemap.xml

生成器取站点地址时用了主站的 home_url,缓存键也只按主站 blog_id 存。请求进来后没有 switch_to_blog,provider 拿到的仍是主站上下文。这一点先确认清楚,后面就不用反复试。

「子站站点地图」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

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

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

具体做法是,清掉 sitemap 的缓存文件与 transient;确认请求上下文里的 blog_id;为每个子站单独触发一次生成。

改完照着核一遍,子站 sitemap 只包含 /news/ 下的 URL,条数与子站已发布文章一致。

作者 9823189