首页列表十二条文章,Query Monitor 显示 247 次查询、页面 1.9 秒,换掉主题再测只剩 31 次,差距全在循环里。乍看像缓存或者权限的锅,追下去往往不是。

update_meta_cache('post', wp_list_pluck($query->posts, 'ID'));
foreach ($query->posts as $p) {
    $views = get_post_meta($p->ID, 'views', true);
}

追下去是这么回事:循环里每篇文章都调一次 get_post_meta,每条单独走一遍数据库,十二条就是十二次以上,再叠加多个字段。这些元数据本可以在主查询时一次性预加载,主题没做这一步。

「模板循环 N+1 查询」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。

具体做法是,先用 update_meta_cache 把当前页的文章 ID 批量预热;循环里照常 get_post_meta 取缓存值,不再触发新查询;用 Query Monitor 对比改动前后的查询数,确认降下来了。

验收就看一点,同一页查询数从两百多降到四十以内,首屏时间跟着下来一截。

作者 9823189