首页 › 博客 › 文章

WordPress 媒体库治理:图片体积、尺寸与老站瘦身

WordPress 媒体库治理:图片体积、尺寸与老站瘦身

结论先行:WordPress 图片优化要在上传前定格式与压缩规则,后台重设缩略图尺寸,再用 SQL 与脚本识别未使用图片;删除前必须查引用。判断做对的标准是媒体库总体积下降、页面图片请求数与 LCP 同时降低,且全站无 404 图片。

准备:环境与工具清单

开始前确认站点运行在 PHP 8.2+ 与 WordPress 6.7+(2026 年主流版本),并具备 WP-CLI 2.11、MySQL 客户端与 image_optimizer 类 CLI 工具(如 cwebp、oxipng)。老站先做全量文件与数据库备份,备份失败时参考 WordPress 备份失败怎么排查:2026 决策指南,不要在无备份环境执行删除。

准备阶段要拿到三样东西:媒体库绝对路径(通常是 wp-content/uploads)、当前主题 functions.php 或子主题路径、以及一张记录原始体积的基线表。用下面命令生成基线:

cd /var/www/html
du -sh wp-content/uploads
find wp-content/uploads -type f ( -iname '*.jpg' -o -iname '*.png' -o -iname '*.webp' ) | wc -l
wp db query "SELECT COUNT(*) AS total FROM wp_posts WHERE post_type='attachment';"

上传前压缩与格式选择

上传前压缩是 WordPress 图片优化的第一道闸门。2026 年浏览器对 WebP 与 AVIF 支持已覆盖 98% 以上流量,默认应把原图转为 WebP,仅对需要透明通道且体积敏感的图保留 AVIF 分支。

本地转换与有损阈值

在 CI 或本地钩子中对上传目录的入站图片做预处理,JPEG 用 mozjpeg 质量 82,PNG 先 oxipng 再转 WebP。命令如下:

# 单目录批量转 WebP,质量 82,跳过已存在文件
for f in /incoming/*.jpg; do
  base="$(basename "$f" .jpg)"
  if [ ! -f "/out/$base.webp" ]; then
    cwebp -q 82 "$f" -o "/out/$base.webp"
  fi
done

WordPress 侧格式白名单

在子主题 functions.php 中限制 mime 并挂接压缩钩子,避免超大图直接入库:

add_filter( 'upload_mimes', function( $m ) {
  $m['webp'] = 'image/webp';
  $m['avif'] = 'image/avif';
  return $m;
} );

add_filter( 'wp_handle_upload_prefilter', function( $file ) {
  if ( $file['size'] > 2 * 1024 * 1024 ) {
    $file['error'] = '原图超过 2MB,请先本地压缩再上传';
  }
  return $file;
} );

验证方式:上传一张 3MB JPEG,应被拦截;上传 800KB WebP,媒体库显示体积≈原文件,且 srcset 自动生成。

缩略图尺寸策略

获取报价

邮箱 + 需求 + 预算区间,24 小时内回复报价。

老站常见问题是历史主题注册了十几组无用尺寸。缩略图尺寸策略要按模板实际调用来裁剪,而不是保留默认三件套。

清理多余尺寸

先列出已注册尺寸:

add_action( 'init', function() {
  global $_wp_additional_image_sizes;
  error_log( print_r( $_wp_additional_image_sizes, true ) );
} );

在 functions.php 用 intermediate_image_sizes_advanced 过滤掉未使用项:

add_filter( 'intermediate_image_sizes_advanced', function( $sizes ) {
  unset( $sizes['medium_large'] );
  unset( $sizes['1536x1536'] );
  unset( $sizes['2048x2048'] );
  return $sizes;
} );

按断点重设

2026 年主流主题用 480/768/1280 三档。用 update_option 直接改 medium 与 large:

wp option update medium_size_w 768
wp option update medium_size_h 0
wp option update large_size_w 1280
wp option update large_size_h 0

改完必须重建旧图缩略图,否则前台仍取老文件: wp media regenerate --yes。验证: wp media image-size 或查 uploads 目录文件名后缀带 -768x、 -1280x 的新文件数量。

未使用图片的识别

未使用图片指 attachment 记录存在但正文、meta、菜单、小工具均未引用。识别靠两步:数据库查引用,文件系统查孤儿。

数据库引用扫描

用 SQL 找出在 post_content 与 postmeta 中未出现的 attachment ID:

SELECT a.ID, a.post_title, pm.meta_value AS file
FROM wp_posts a
JOIN wp_postmeta pm ON pm.post_id = a.ID AND pm.meta_key = '_wp_attached_file'
WHERE a.post_type = 'attachment'
AND NOT EXISTS (
  SELECT 1 FROM wp_posts p
  WHERE p.post_content LIKE CONCAT('%', SUBSTRING_INDEX(pm.meta_value,'/',-1), '%')
)
AND NOT EXISTS (
  SELECT 1 FROM wp_postmeta m
  WHERE m.meta_value LIKE CONCAT('%', SUBSTRING_INDEX(pm.meta_value,'/',-1), '%')
);

文件系统孤儿文件

对比 DB 的 _wp_attached_file 与实际磁盘文件,列出无记录文件:

wp db query "SELECT meta_value FROM wp_postmeta WHERE meta_key='_wp_attached_file';" --skip-column-names > /tmp/db_files.txt
find wp-content/uploads -type f | sed 's#wp-content/uploads/##' | sort > /tmp/disk_files.txt
comm -13 <(sort /tmp/db_files.txt) /tmp/disk_files.txt > /tmp/orphans.txt

踩坑:多站点路径含 sites/2,需先切 blog 再取 meta;失败时回到 /tmp 列表人工抽检。

删除前的引用检查

删除前引用检查是最后防线。除了正文,还要查主题模板、widget、options 与 menu。

全站字符串检索

对候选文件名做全库+全目录检索:

wp db query "SELECT option_name FROM wp_options WHERE option_value LIKE '%hero-banner%';"
grep -r 'hero-banner' wp-content/themes wp-content/plugins wp-content/uploads 2>/dev/null

若命中主题头图或 options 中的 logo,则不能删。只有零命中且 orphan 列表中的文件才可进入删除队列。若站点曾做迁移,先读 WordPress 迁移后页面打不开怎么办:2026 决策指南 确认无旧路径残留。

实施步骤

实施步骤
  1. 备份:执行 wp db export 与 tar czf uploads.tar.gz wp-content/uploads。
  2. 预处理:用 cwebp/oxipng 压缩新图,functions.php 挂 2MB 拦截。
  3. 调尺寸:update_option 设 768/1280,regenerate 重建。
  4. 扫孤儿:跑 SQL 与 comm 生成 /tmp/orphans.txt。
  5. 查引用:对每个候选跑 grep 与 options 查询,标记可删。
  6. 删文件:rm 孤儿文件并 wp post delete <id> --force 清记录。

验证与回滚

验证做对:跑 du -sh wp-content/uploads 对比基线,降幅应>30%;用 Lighthouse 看 LCP 与图片请求数下降。若某步误删,回滚顺序是先停站点写操作,解压 uploads.tar.gz 覆盖,再 wp db import backup.sql。若缩略图策略改错导致空白图,用 wp option update medium_size_w 300 还原并 regenerate。

长期维护可交由专业团队做定制治理,详见 WordPress 功能定制与优化 服务页,涵盖媒体库清理与自动化管线搭建。

常见问题

WordPress 图片优化一定要装插件吗?

不一定。命令行+钩子能覆盖压缩与尺寸,插件仅省事;核心是规则与验证,不是工具形态。

regenerate 后前台仍请求旧图?

多为 CDN 或 page cache 未清。执行 wp cache flush 并刷新 CDN,再查 HTML 源码 srcset。

孤儿文件能直接 rm 吗?

不能。必须先过 options、主题、menu 检索,零命中才删,否则会触发 404 与布局错乱。

可执行动作清单

  • 今日:导出 uploads 与 DB,记录 du 基线。
  • 本周:functions.php 加 mime 与 2MB 拦截,CI 接 cwebp。
  • 本月:重设 768/1280 并 regenerate 全站。
  • 下月:跑孤儿 SQL+comm,删零引用文件。
  • 持续:每次发版前 grep 新图是否被模板引用。

想让老站图片治理一次到位?查看我们的定制优化服务,少走弯路。更多技术文章见 技术栏目。

参考资料与延伸阅读

WPDaiwei

WPDaiwei-专业Wordpress网站定制开发提供商

需要 WordPress 开发服务?

24 小时内免费出方案与报价,国内国外都接单。

QQ