媒体库列表两万多个附件,打开转 12 秒,点下一页再等 10 秒。服务器 CPU 不高,MySQL 慢日志里同一条 postmeta 查询出现 60 次。乍看像缓存或者权限的锅,追下去往往不是。
add_action('pre_get_posts', function ($q) {
if ($q->get('post_type') === 'attachment' && is_admin()) {
$q->set('posts_per_page', 40);
}
});
追下去是这么回事:列表模式每页 20 条,主题在后台挂了列显示钩子,对每个附件都取 alt、文件大小和所属文章,各查一次元数据。两万条的总量让 count 查询也很重。
「媒体库列表慢」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
监控和日志的时间要对上,时区不一致会多绕很大一圈。
具体做法是,用 Query Monitor 看媒体库页面的查询数和重复 SQL;把逐条取元数据改成一次 update_meta_cache 预热;列表只显示必要列 减少缩略图请求。
验收就看一点,媒体库首屏加载降到 3 秒以内,Query Monitor 里同一条 postmeta 查询不再重复几十次。
