利用WP-CLI快速清理缩略图元数据

前言

众所周知,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处理,安全,高效。

  1. 在网站根目录新建一个名为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} 个附件");
  1. SSH终端连接到服务器,进入站点根目录。
# 进入站点根目录,注意替换为你自己的路径
cd /www/wwwroot/www.yhzyw.top
  1. 执行清理脚本
# 执行清理脚本
wp eval-file clean_thumbnail_meta.php
图片[1]-利用WP-CLI快速清理缩略图元数据

注意,处理失败的就是没有缩略图元数据的,不用理会。

  1. 验证清理结果
# 替换 60 为你的图片附件ID
wp post meta get 60 _wp_attachment_metadata
图片[2]-利用WP-CLI快速清理缩略图元数据

预期输出如上图(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
喜欢就支持一下吧
点赞12 分享