首页聚合各子站最新 3 篇,打开 8.4 秒,慢查询日志里出现 200 条结构相同的 SELECT。日志里能对上时间点,这种反而好排。

循环里每个子站都 switch_to_blog 再 new WP_Query,连接和对象缓存反复切换,开销叠加。没有一次性按表查询,也没有做结果缓存。这一点先确认清楚,后面就不用反复试。

$sql = "(SELECT ID, post_title, 2 AS blog_id FROM wp_2_posts WHERE post_status='publish' ORDER BY post_date DESC LIMIT 3)
UNION ALL
(SELECT ID, post_title, 3 AS blog_id FROM wp_3_posts WHERE post_status='publish' ORDER BY post_date DESC LIMIT 3)";
$rows = $wpdb->get_results($sql);

围绕「跨站内容聚合慢」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

处理上按这个顺序:把循环站数从 200 降到 20 个活跃站;用 UNION 直接查各子站的 posts 表;结果放 transient 缓存 5 分钟。

结果对不对很好判断,聚合页降到 1.2 秒,文章顺序和各子站后台一致。

作者 9823189