前言
众所周知,WordPress如果使用媒体库上传图片,就会自动生成一堆缩略图,占用存储空间。榆桦建站之初测试功能没有禁止缩略图生成,导致出现了一堆缩略图,我直接在wp-content/uploads路径中删除了所有缩略图,但诡异的事情也发生了。文章图片成了X,即使在文章编辑中将图片重新指向为原始图片的路径依然无效。文章页中始终使用的缩略图路径。
解决方案
经过对数据库的搜索,不难发现数据存储在wp_postmeta的meta_value键值中。但它的存储是一组元数据。直接删掉里面的图片路径必定会出问题。
元数据示例
a:6:{s:5:"width";i:2133;s:6:"height";i:562;s:4:"file";s:66:"2026/01/20260121130605840-b173239b-ceb7-4c71-8e21-b2571d4f277e.png";s:8:"filesize";i:65337;s:5:"sizes";a:3:{s:6:"medium";a:5:{s:4:"file";s:66:"20260121130605840-b173239b-ceb7-4c71-8e21-b2571d4f277e-800x211.png";s:5:"width";i:800;s:6:"height";i:211;s:9:"mime-type";s:9:"image/png";s:8:"filesize";i:18198;}s:5:"large";a:5:{s:4:"file";s:67:"20260121130605840-b173239b-ceb7-4c71-8e21-b2571d4f277e-1024x270.png";s:5:"width";i:1024;s:6:"height";i:270;s:9:"mime-type";s:9:"image/png";s:8:"filesize";i:26825;}s:9:"thumbnail";a:5:{s:4:"file";s:66:"20260121130605840-b173239b-ceb7-4c71-8e21-b2571d4f277e-150x150.png";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:9:"image/png";s:8:"filesize";i:1174;}}s:10:"image_meta";a:12:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";s:11:"orientation";s:1:"0";s:8:"keywords";a:0:{}}}
用WP-CLI处理,安全,高效。
- 在网站根目录新建一个名为clean_thumbnail_meta.php的文件,将下面代码粘贴进去保存。
<?php
/**
* 单站点WordPress安全清理图片附件缩略图源数据
* 仅保留原始尺寸,清空sizes数组
*/
if (!defined('WP_CLI')) {
die('该脚本仅支持通过WP-CLI执行!');
}
// 查询所有图片类型的附件ID(单站点直接查询)
$image_attachments = get_posts([
'post_type' => 'attachment',
'post_mime_type' => 'image', // 仅处理图片附件
'posts_per_page' => -1, // 处理所有图片
'post_status' => 'inherit',
'fields' => 'ids', // 仅获取ID,提升效率
]);
if (empty($image_attachments)) {
WP_CLI::success('未找到任何图片附件,无需清理!');
exit;
}
$processed = 0; // 成功处理数
$failed = 0; // 失败数
// 遍历清理每个图片附件的元数据
foreach ($image_attachments as $attachment_id) {
// 获取原始元数据(WordPress序列化数组)
$original_meta = get_post_meta($attachment_id, '_wp_attachment_metadata', true);
// 跳过空数据/非数组数据,避免报错
if (empty($original_meta) || !is_array($original_meta)) {
$failed++;
continue;
}
// 仅保留原始尺寸核心数据,清空所有缩略图(sizes)数据
$cleaned_meta = [
'width' => $original_meta['width'] ?? 0,
'height' => $original_meta['height'] ?? 0,
'file' => $original_meta['file'] ?? '',
'filesize' => $original_meta['filesize'] ?? 0,
'sizes' => [], // 清空缩略图尺寸数据
'image_meta'=> $original_meta['image_meta'] ?? [],
];
// 更新元数据(安全替换,保留原始字段结构)
$update_result = update_post_meta(
$attachment_id,
'_wp_attachment_metadata',
$cleaned_meta,
$original_meta // 对比原始值,确保仅修改目标数据
);
if ($update_result !== false) {
$processed++;
WP_CLI::log("✅ 已清理附件ID {$attachment_id} 的缩略图源数据");
} else {
$failed++;
WP_CLI::warning("⚠️ 清理附件ID {$attachment_id} 失败!");
}
}
// 输出最终统计
WP_CLI::success("📊 清理完成!成功处理:{$processed} 个附件,失败:{$failed} 个附件");
- SSH终端连接到服务器,进入站点根目录。
# 进入站点根目录,注意替换为你自己的路径
cd /www/wwwroot/www.yhzyw.top
- 执行清理脚本
# 执行清理脚本
wp eval-file clean_thumbnail_meta.php
![图片[1]-利用WP-CLI快速清理缩略图元数据](https://www.yhzyw.top/wp-content/uploads/2026/01/20260130031052161-QQ20260130-031001.png)
注意,处理失败的就是没有缩略图元数据的,不用理会。
- 验证清理结果
# 替换 60 为你的图片附件ID
wp post meta get 60 _wp_attachment_metadata
![图片[2]-利用WP-CLI快速清理缩略图元数据](https://www.yhzyw.top/wp-content/uploads/2026/01/20260130031440254-QQ20260130-031422.png)
预期输出如上图(sizes 为空,仅保留原始尺寸):
array (
'width' => 2133,
'height' => 562,
'file' => '2026/01/20260121130605840-b173239b-ceb7-4c71-8e21-b2571d4f277e.png',
'filesize' => 65337,
'sizes' =>
array (
),
'image_meta' =>
array (
'aperture' => '0',
'credit' => '',
'camera' => '',
'caption' => '',
'created_timestamp' => '0',
'copyright' => '',
'focal_length' => '0',
'iso' => '0',
'shutter_speed' => '0',
'title' => '',
'orientation' => '0',
'keywords' =>
array (
),
),
)
到此,数据库中所有残留的缩略图元数据全部清理干净,回到文章页刷新,图片正常显示。如果还是没显示,先重新指定到原图路径上。然后清理下缓存就好了。
教程结束。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END




