删除各种尺寸图片的原因:
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_metadata
的 meta_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');
备注:执行代码只需要刷新一次媒体库页面,代码会自动执行,执行时间因服务器性能有差别,轻量服务器很可能502报错。如果报错就代码重新复制再试一次,通常2分钟内完成。(1000张图片以下)
脚本的改进点和解释
- 确保函数只执行一次:
- 我添加了一个检查,以确保此脚本只运行一次。使用
get_option('media_thumbnails_fixed')
检查选项值是否已设置,如果设置了,直接返回,不再执行脚本。这可以防止重复运行,避免不必要的资源消耗。 update_option('media_thumbnails_fixed', true);
在脚本成功运行后设置一个选项,表示脚本已经执行过。
- 我添加了一个检查,以确保此脚本只运行一次。使用
- 批量处理附件类型的媒体文件:
- 使用
get_posts
获取所有类型为attachment
的媒体文件,并通过posts_per_page => -1
确保获取所有附件。
- 使用
- 确保清空
sizes
数组:- 脚本检查
meta['sizes']
是否存在,存在的话将其清空,然后调用wp_update_attachment_metadata
更新元数据。
- 脚本检查
- 输出更新状态:
- 在每次更新后,使用
echo
输出附件 ID,这样你可以看到脚本执行的进度和状态。
- 在每次更新后,使用
使用方法
- 添加脚本:
- 将改进后的脚本添加到 WordPress 主题的
functions.php
文件,或者创建一个新的自定义插件文件(推荐这种方式,以便于管理和控制)。
- 将改进后的脚本添加到 WordPress 主题的
- 执行脚本:
- 刷新你的网站前端页面(例如访问首页),脚本将在
init
时执行。
- 刷新你的网站前端页面(例如访问首页),脚本将在
- 移除或禁用脚本:
- 执行完毕后,请移除或注释掉代码,以防止脚本在每次页面加载时重复执行。
注意事项
- 备份数据库:在进行任何批量数据库操作之前,务必备份你的 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');
改进点和解释
- 确保函数只执行一次:
- 使用
get_option('thumbnail_urls_replaced')
来检查是否已执行过,以避免重复执行。 update_option('thumbnail_urls_replaced', true);
用于标记脚本已执行完成。
- 使用
- 获取所有文章:
get_posts
用于获取所有已发布的文章,posts_per_page
设置为-1
以确保获取所有文章。
- 正则表达式改进:
- 修改正则表达式
/wp-content\/uploads\/(.*?)\-(\d+x\d+)\.(jpg|jpeg|png|gif)/i
,用于匹配包含尺寸信息的缩略图 URL。 - 在
preg_replace
中,/-(\d+x\d+)\.(jpg|jpeg|png|gif)$/i
处理匹配并移除尺寸信息,保留文件扩展名。
- 修改正则表达式
- 替换旧缩略图 URL 为原始图像 URL:
- 使用
str_replace
替换文章内容中的旧缩略图 URL 为原始图像 URL。
- 使用
- 更新文章内容:
- 使用
wp_update_post
更新每篇文章的内容。
- 使用
- 输出更新状态:
echo 'Updated post ID ' . $post->ID . '<br>';
用于显示更新进度,方便查看处理情况。
使用方法
- 添加脚本:
- 将此脚本添加到 WordPress 主题的
functions.php
文件,或创建一个新的自定义插件文件。
- 将此脚本添加到 WordPress 主题的
- 执行脚本:
- 刷新你的网站前端页面(例如访问首页),脚本将在
init
钩子时执行。
- 刷新你的网站前端页面(例如访问首页),脚本将在
- 移除或禁用脚本:
- 执行完毕后,记得移除或注释掉脚本,以避免重复执行。
注意事项
- 备份数据库:在执行批量替换之前务必备份你的数据库。
- 检查替换效果:确保替换后的文章中缩略图正常显示。
扩展:数据库中对应字段解析
数据库中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
解析
- 原始图像信息:
- 宽度(
width
):1080 像素 - 高度(
height
):594 像素 - 文件路径(
file
):2021/05/google-ads-create-3.png
(这是相对于 WordPressuploads
目录的路径)
- 宽度(
- 缩略图信息(
sizes
):sizes
是一个包含各种缩略图版本的数组,每个缩略图有其对应的文件名、宽度、高度和 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
- 文件名:
- 图像元数据(
image_meta
): 这些是关于图像的额外元数据信息,通常来自于 EXIF 数据或手动输入的图片信息,但此处大部分字段为空或为默认值(如0
)。这些字段包括:- 光圈值(
aperture
):0
- 信用(
credit
):""
(空值) - 相机型号(
camera
):""
(空值) - 图片说明(
caption
):""
(空值) - 创建时间戳(
created_timestamp
):0
- 版权(
copyright
):""
(空值) - 焦距(
focal_length
):0
- ISO 感光度(
iso
):0
- 快门速度(
shutter_speed
):0
- 标题(
title
):""
(空值) - 方向(
orientation
):0
- 关键词(
keywords
):空数组
- 光圈值(
推荐阅读:https://www.huitheme.com/wordpress-thumbnail-rebuild.html