
文章目录
结论先行: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 决策指南 确认无旧路径残留。
实施步骤

- 备份:执行
wp db export与tar czf uploads.tar.gz wp-content/uploads。 - 预处理:用 cwebp/oxipng 压缩新图,functions.php 挂 2MB 拦截。
- 调尺寸:update_option 设 768/1280,regenerate 重建。
- 扫孤儿:跑 SQL 与 comm 生成 /tmp/orphans.txt。
- 查引用:对每个候选跑 grep 与 options 查询,标记可删。
- 删文件: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 新图是否被模板引用。
想让老站图片治理一次到位?查看我们的定制优化服务,少走弯路。更多技术文章见 技术栏目。
