路径很长很麻烦,简要概述。
背景
站点已有很多年,其中缩略图产生了无数,其中有大部分不需要,需要清理进行缩减。本文用于记录,同时也做分享。
完整的踩过坑后,插件配合脚本配合 404 检测工具,可能是最为流畅安全的方式。
过程/思路
1、全量备份站点,本地部署
首先备份站点是肯定的,一份全量的备份包出事了也有足够的安全感,同时部署在本地。
找两个插件,一个是 Regenerate-thumbnails,一个是 Media-cleaner,后台安装即可。
用 Media-cleaner 清除无用资源后,再禁用缩略图,仅保留 WordPress 所必需的几个尺寸。
(可选)将以下代码加入 function.php
,这俩基本用不着,同时站点得多富贵才能反向扩张,原图 1m 直接给干到 2.5m:
function disable_large_image_sizes() { update_option('medium_large_size_w', 0); // 移除 768x0(可选) remove_image_size('1536x1536'); // 移除 1536x1536 remove_image_size('2048x2048'); // 移除 2048x2048 } add_action('init', 'disable_large_image_sizes');
如果 function.php
存在主题/插件不需要的缩略图尺寸可取消注册。如果不清楚可全部取消注册,后续通过 404 缺失找回。大概只有野生的或者没开发完的才会在主题都没写完的情况下就注册了一堆,例如,本站后来经过个人二次开发后确认这些都已无用:
// add_image_size('top-thumb', 1920, 1080, true);
// add_image_size('cat-thumb', 1120, 292, true);
// add_image_size('index-thumb', 290, 250, true);
// add_image_size('gallery-thumb', 580, 500, true);
在 Regenerate-thumbnails 插件后台选中 删除旧的未注册尺寸的缩略图文件
,重新生成。

2、压缩清理后的图片
重新生成完成后,则开始压缩图片,MacOS 这边推荐 ImageOption :https://imageoptim.com/mac
(可选)这里如果觉得需要压缩的文件过多,可以选择去 WordPress后台 -> 设置 -> 媒体,全部改为 0
,并注释所有主题注册的尺寸,则用重新生成缩略图后,将只剩原图,减少压缩数量。
压缩完成后,将需要的缩略图尺寸都恢复。 Regenerate-thumbnails 也可以看到所有注册的尺寸,保留 150、300、768、1024 是因为WordPress 后台,以及一些插件比如 Media-cleaner 会普遍使用这几个尺寸。
(可选)可以去除 150、300 这两个尺寸,将在后续不再生成,而新的需要用到的地方,会向上取资源,比如 768 ,但之前用到的 150、300 资源需要补齐避免错误。总的来说 768 可以满足缩略图的高清, 1024 可以保证文章内容图的可用, 150 和 300,实无大用。
3、找网站中的 404
找一个工具叫 Siteone-Crawler:https://crawler.siteone.io/ ,他会告诉你什么叫专业挖资源,可以在缺少资源时,给予一个名单以及数量。对本地的网站进行检测即可,会在 tmp 目录生成一个 html,打开后在 404 那栏会给出列表,列表可选中进行复制,能得到类似以下字符串:
404 /wp-content/uploads/2020/08/2020082407350869-1024x706.png /?p=xx
404 /wp-content/uploads/2020/08/2020082407262876-1024x638.png /?p=xx
自己写个脚本将 Siteone-Crawler 检测到 404 的资源从全量备份里捞出来。个人习惯于 kotlin 方便调试路径,其他语言需求可以找 GPT,并不难。
val F404: String = """
404 /wp-content/uploads/2020/08/2020082407350869-1024x706.png /?p=xx
404 /wp-content/uploads/2020/08/2020082407262876-1024x638.png /?p=xx
"""
fun main() {
val copys: MutableList<String> = mutableListOf()
val lines = F404.lines().filter { it.isNotEmpty() }
lines.size.toString().show()
lines.forEach {
val split = it.split("\t")
copys.add(split[1])
}
copys.size.toString().show()
val sourceDir = "/Users/ilckiss/Downloads"
val destDir = "/Users/ilckiss/Downloads/dst"
copys.forEach {
val sourceFile = File("$sourceDir$it")
sourceFile.absolutePath.show()
val destFile = File("$destDir$it")
destFile.absolutePath.show()
if (!destFile.parentFile.exists()) {
destFile.parentFile.mkdirs()
}
runCatching {
if (!destFile.exists()) {
sourceFile.copyTo(destFile)
}
}.onFailure { e ->
sourceFile.absolutePath.show()
e.printStackTrace()
}
}
}
补完缺失图后,去 WordPress 后台点媒体,全部浏览一次,打开浏览器的检查模式,看是否还有 404 ,如果某个尺寸大量缺失,就去 function.php
把尺寸补回来,并重新生成缩略图。
4、部署线上环境
干掉线上的 uploads 目录,上传过滤后的资源文件,再用 Siteone-Crawler 扫一遍,观测一下日志中的 404 ,大差不差缺几个头像尺寸,补全资源即可。
总体流程:干掉所有缩略图 -> 压缩原图 -> 增加必须尺寸 -> 重新生成缩略图 -> 找 404 -> 补齐资源。
5、清理数据库
数据库 wp_postmeta
表中会记录过去的失效的缩略图,首先清空 _wp_attachment_backup_sizes
DELETE FROM wp_postmeta WHERE meta_key = '_wp_attachment_backup_sizes';
其次,还会在 wp_postmeta
的 _wp_attachment_metadata
中残留,可使用脚本清理,源自 GPT,cleanup-thumbnails.php
:
<?php
/**
* 清理 WordPress 数据库中无效的缩略图记录
* 注意:请在运行前备份数据库!
*/
define('WP_USE_THEMES', false);
require_once('wp-load.php'); // 确保脚本运行在 WordPress 环境下
global $wpdb;
$attachments = $wpdb->get_results("
SELECT post_id, meta_value FROM {$wpdb->postmeta}
WHERE meta_key = '_wp_attachment_metadata'
");
$upload_dir = wp_upload_dir(); // 获取上传目录
foreach ($attachments as $attachment) {
$meta_value = maybe_unserialize($attachment->meta_value);
$post_id = $attachment->post_id;
if (!isset($meta_value['file'])) {
continue;
}
// 获取主文件路径
$main_file = $upload_dir['basedir'] . '/' . $meta_value['file'];
// 如果主文件不存在,则删除该记录
if (!file_exists($main_file)) {
$wpdb->query($wpdb->prepare("
DELETE FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = '_wp_attachment_metadata'
", $post_id));
echo "已删除无效的附件记录:Post ID = {$post_id}\n";
continue;
}
// 检查缩略图是否存在
if (isset($meta_value['sizes'])) {
foreach ($meta_value['sizes'] as $size => $size_info) {
$thumb_file = $upload_dir['basedir'] . '/' . dirname($meta_value['file']) . '/' . $size_info['file'];
if (!file_exists($thumb_file)) {
unset($meta_value['sizes'][$size]); // 从 metadata 里移除无效缩略图
echo "移除无效缩略图 {$size_info['file']}(Post ID = {$post_id})\n";
}
}
}
// 更新数据库,去除无效的缩略图记录
update_post_meta($post_id, '_wp_attachment_metadata', $meta_value);
}
echo "🎉 数据库清理完成!\n";
?>
放在网站根目录访问即可,不放心可以先注释代码中的执行代码,进行查询看是否符合要求,使用完删除文件避免被人恶意利用。
结果
在今日 10:00 AM ,迎来了备份脚本的第一次备份,同时也再次使用了 Siteone-Crawler 并对相关日志进行了 404 查找,并未发现错误,缩减后的备份文件效果:

很满意,以上。
PS:本站对于 404 存在检测机制,如果正常可访问路径 404,请勿重复访问,容易被关 7 天小黑屋。如有必要请邮件告知问题,评论也可联系进行补图。
本站由以下主机服务商提供服务支持:
0条评论