WordPress 删除Uploads缩略图,媒体库和文章中图片加载不出来!【已解决】

删除各种尺寸图片的原因:

WordPress 的媒体尺寸明明就只给出了这3个尺寸的设定,可在wp-content/uploads还是能够看到一张图片生成了出很多其他尺寸文件出来,这大大的增加了网站服务器硬盘的使用。

推荐阅读:WordPress关闭图片自动裁剪功能

针对生成众多的图片尺寸无疑会增加空间的存储,通常可能会增加一倍的空间占用,另外一方面就是日后对部分图片修改,你要找到对应尺寸的图片进行修改,不同尺寸一般会出现在不同尺寸的设备上,修改漏了会比较麻烦。针对目前的互联网速度加上CDN加持,一般情况原图片对网站的加载速度不会太大。

基于上述两个主要原因:占空间、便于修改应用于各个尺寸终端,我们选择把WordPress的Uploads除原图尺寸都删除。删除分为手动和插件完成,手动还可以批量删除,就是把文件拷贝到桌面删除完再上传。大力推荐插件!!!如不使用插件将会面临下面的问题:

媒体库图片加载不出来

如果你有几百个媒体库图片需要调整,手动修改显然不切实际。你可以使用以下方法之一,通过自动化方式批量解决问题:

方法 1:使用 SQL 脚本批量更新数据库(未测试,请慎重)

你可以通过编写一个 SQL 脚本来批量清空或调整所有图片的 sizes 数组。这个方法直接在数据库层面操作,效率很高,但需要确保操作前备份数据库,以防意外。

SQL 示例:清空所有图片的 sizes 数组

UPDATE wp_postmeta 
SET meta_value = REPLACE(meta_value, 's:5:"sizes";a:', 's:5:"sizes";a:0:{}')
WHERE meta_key = '_wp_attachment_metadata';

这条 SQL 语句将 wp_postmeta 表中所有 _wp_attachment_metadatameta_value 字段内的 sizes 数组替换为空数组。请确保在运行这条语句之前备份你的数据库。

方法 2:编写 WordPress 自定义 PHP 脚本(亲测有效!)

你可以编写一个 PHP 脚本,利用 WordPress 的函数批量处理所有媒体文件。这个方法更加安全,因为它使用 WordPress 的 API 和函数来操作数据库。

PHP 脚本示例

将以下代码添加到你的主题的 functions.php 文件中,或创建一个单独的插件文件(推荐这种方式)。执行完毕后,记得移除或注释掉该代码。

function fix_media_thumbnails() {// 确保函数只执行一次if (get_option('media_thumbnails_fixed')) {    return; // 已执行,直接返回}
// 获取所有的附件类型的媒体文件$args = array(    'post_type'      => 'attachment',    'post_status'    => 'inherit',    'posts_per_page' => -1, // 获取所有媒体文件);$attachments = get_posts($args);
if ($attachments) {    foreach ($attachments as $attachment) {        // 获取当前附件的元数据        $meta = wp_get_attachment_metadata($attachment->ID);
        if (!empty($meta) && isset($meta['sizes'])) {            // 清空 sizes 数组            $meta['sizes'] = array();
            // 更新元数据            wp_update_attachment_metadata($attachment->ID, $meta);
            echo 'Updated attachment ID ' . $attachment->ID . '<br>';        }    }}
// 标记任务已完成update_option('media_thumbnails_fixed', true);
}
add_action('init', 'fix_media_thumbnails');

脚本的改进点和解释

  1. 确保函数只执行一次
    • 我添加了一个检查,以确保此脚本只运行一次。使用 get_option('media_thumbnails_fixed') 检查选项值是否已设置,如果设置了,直接返回,不再执行脚本。这可以防止重复运行,避免不必要的资源消耗。
    • update_option('media_thumbnails_fixed', true); 在脚本成功运行后设置一个选项,表示脚本已经执行过。
  2. 批量处理附件类型的媒体文件
    • 使用 get_posts 获取所有类型为 attachment 的媒体文件,并通过 posts_per_page => -1 确保获取所有附件。
  3. 确保清空 sizes 数组
    • 脚本检查 meta['sizes'] 是否存在,存在的话将其清空,然后调用 wp_update_attachment_metadata 更新元数据。
  4. 输出更新状态
    • 在每次更新后,使用 echo 输出附件 ID,这样你可以看到脚本执行的进度和状态。

使用方法

  1. 添加脚本
    • 将改进后的脚本添加到 WordPress 主题的 functions.php 文件,或者创建一个新的自定义插件文件(推荐这种方式,以便于管理和控制)。
  2. 执行脚本
    • 刷新你的网站前端页面(例如访问首页),脚本将在 init 时执行。
  3. 移除或禁用脚本
    • 执行完毕后,请移除或注释掉代码,以防止脚本在每次页面加载时重复执行。

注意事项

  • 备份数据库:在进行任何批量数据库操作之前,务必备份你的 WordPress 数据库,以防万一。
  • 检查网站前台和后台:执行完脚本后,检查媒体库是否正常显示所有图片。

文章中图片加载不出来

文章中图片加载不出来

如果之前的文章中使用了缩略图,而你清空了所有媒体文件的 sizes 数组,那么这些文章中引用的缩略图可能会无法正常显示。要解决这个问题,你可以使用以下几种方法来批量处理文章中的缩略图引用,确保它们能正常显示。

方法 1:批量替换文章中的缩略图引用

可以编写一个 PHP 脚本,遍历所有文章,检查并替换那些引用了旧缩略图的 URL,将其替换为原始图像的 URL。

PHP 脚本示例

以下是一个 PHP 脚本,用于批量查找和替换文章中的缩略图引用。

function replace_thumbnail_urls_in_posts() {// 确保函数只执行一次if (get_option('thumbnail_urls_replaced')) {    return; // 已执行,直接返回}
// 获取所有的文章$args = array(    'post_type'      => 'post',    'post_status'    => 'publish',    'posts_per_page' => -1, // 获取所有文章);$posts = get_posts($args);
if ($posts) {    foreach ($posts as $post) {        $content = $post->post_content; // 获取文章内容
        // 匹配文章内容中的缩略图 URL        preg_match_all('/wp-content\/uploads\/(.*?)\-(\d+x\d+)\.(jpg|jpeg|png|gif)/i', $content, $matches);
        if (!empty($matches[0])) {            foreach ($matches[0] as $key => $old_url) {                // 构建原始图像 URL                $original_url = preg_replace('/-(\d+x\d+)\.(jpg|jpeg|png|gif)$/i', '.$2', $old_url);
                // 替换旧缩略图 URL 为原始图像 URL                $content = str_replace($old_url, $original_url, $content);            }
            // 更新文章内容            wp_update_post(array(                'ID'           => $post->ID,                'post_content' => $content            ));
            echo 'Updated post ID ' . $post->ID . '<br>';        }    }}
// 标记任务已完成update_option('thumbnail_urls_replaced', true);
}
add_action('init', 'replace_thumbnail_urls_in_posts');

改进点和解释

  1. 确保函数只执行一次
    • 使用 get_option('thumbnail_urls_replaced') 来检查是否已执行过,以避免重复执行。
    • update_option('thumbnail_urls_replaced', true); 用于标记脚本已执行完成。
  2. 获取所有文章
    • get_posts 用于获取所有已发布的文章,posts_per_page 设置为 -1 以确保获取所有文章。
  3. 正则表达式改进
    • 修改正则表达式 /wp-content\/uploads\/(.*?)\-(\d+x\d+)\.(jpg|jpeg|png|gif)/i,用于匹配包含尺寸信息的缩略图 URL。
    • preg_replace 中,/-(\d+x\d+)\.(jpg|jpeg|png|gif)$/i 处理匹配并移除尺寸信息,保留文件扩展名。
  4. 替换旧缩略图 URL 为原始图像 URL
    • 使用 str_replace 替换文章内容中的旧缩略图 URL 为原始图像 URL。
  5. 更新文章内容
    • 使用 wp_update_post 更新每篇文章的内容。
  6. 输出更新状态
    • echo 'Updated post ID ' . $post->ID . '<br>'; 用于显示更新进度,方便查看处理情况。

使用方法

  1. 添加脚本
    • 将此脚本添加到 WordPress 主题的 functions.php 文件,或创建一个新的自定义插件文件。
  2. 执行脚本
    • 刷新你的网站前端页面(例如访问首页),脚本将在 init 钩子时执行。
  3. 移除或禁用脚本
    • 执行完毕后,记得移除或注释掉脚本,以避免重复执行。

注意事项

  • 备份数据库:在执行批量替换之前务必备份你的数据库。
  • 检查替换效果:确保替换后的文章中缩略图正常显示。

扩展:数据库中对应字段解析

数据库中meta_value字段的一个值:

(禁用多尺寸前)

a:5:{s:5:"width";i:1080;s:6:"height";i:594;s:4:"file";s:31:"2021/05/google-ads-create-3.png";s:5:"sizes";a:5:{s:6:"medium";a:4:{s:4:"file";s:31:"google-ads-create-3-300x165.png";s:5:"width";i:300;s:6:"height";i:165;s:9:"mime-type";s:9:"image/png";}s:5:"large";a:4:{s:4:"file";s:32:"google-ads-create-3-1024x563.png";s:5:"width";i:1024;s:6:"height";i:563;s:9:"mime-type";s:9:"image/png";}s:9:"thumbnail";a:4:{s:4:"file";s:31:"google-ads-create-3-150x150.png";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:9:"image/png";}s:12:"medium_large";a:4:{s:4:"file";s:31:"google-ads-create-3-768x422.png";s:5:"width";i:768;s:6:"height";i:422;s:9:"mime-type";s:9:"image/png";}s:21:"elementor_custom_400x";a:4:{s:4:"file";s:83:"elementor/thumbs/google-ads-create-3-p7a4582rs4hzgnzsgki2d72lqbv0vgxsxp63vqrlp4.png";s:5:"width";i:400;s:6:"height";i:0;s:9:"mime-type";s:9:"image/png";}}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:{}}}

(禁用多尺寸后)

a:6:{s:5:"width";i:718;s:6:"height";i:285;s:4:"file";s:35:"2023/12/Google-Ads-conversion-1.jpg";s:8:"filesize";i:59110;s:5:"sizes";a:0:{}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:{}}}

由于 sizes 数组为空,WordPress 不会尝试加载任何指定尺寸的缩略图文件。相反,它使用了原始图像文件 (file 字段) 来显示。这解释了为什么该图像可以正常显示。

meta_value 解析

  1. 原始图像信息
    • 宽度(width:1080 像素
    • 高度(height:594 像素
    • 文件路径(file2021/05/google-ads-create-3.png(这是相对于 WordPress uploads 目录的路径)
  2. 缩略图信息(sizessizes 是一个包含各种缩略图版本的数组,每个缩略图有其对应的文件名、宽度、高度和 MIME 类型:
    • medium
      • 文件名:google-ads-create-3-300x165.png
      • 宽度:300 像素
      • 高度:165 像素
      • MIME 类型:image/png
    • large
      • 文件名:google-ads-create-3-1024x563.png
      • 宽度:1024 像素
      • 高度:563 像素
      • MIME 类型:image/png
    • thumbnail
      • 文件名:google-ads-create-3-150x150.png
      • 宽度:150 像素
      • 高度:150 像素
      • MIME 类型:image/png
    • medium_large
      • 文件名:google-ads-create-3-768x422.png
      • 宽度:768 像素
      • 高度:422 像素
      • MIME 类型:image/png
    • elementor_custom_400x
      • 文件名:elementor/thumbs/google-ads-create-3-p7a4582rs4hzgnzsgki2d72lqbv0vgxsxp63vqrlp4.png
      • 宽度:400 像素
      • 高度:0 像素(未定义高度)
      • MIME 类型:image/png
  3. 图像元数据(image_meta: 这些是关于图像的额外元数据信息,通常来自于 EXIF 数据或手动输入的图片信息,但此处大部分字段为空或为默认值(如 0)。这些字段包括:
    • 光圈值(aperture0
    • 信用(credit""(空值)
    • 相机型号(camera""(空值)
    • 图片说明(caption""(空值)
    • 创建时间戳(created_timestamp0
    • 版权(copyright""(空值)
    • 焦距(focal_length0
    • ISO 感光度(iso0
    • 快门速度(shutter_speed0
    • 标题(title""(空值)
    • 方向(orientation0
    • 关键词(keywords:空数组

推荐阅读:https://www.huitheme.com/wordpress-thumbnail-rebuild.html

滚动至顶部
扫描微信二维码联系我们 关闭