批量修复 WordPress 文章插图地址

“没图你说个 JB”,这是以前很火的网络用语,虽然不太文明,但是我很认同。如果一个网页满屏都是文字,我们会觉得无聊;如果原本有图片,而且图片内容很重要,然而图却挂了,那么我们会抓狂。

许多 WordPress 站点是由个人运营的,就像本站一样,并且个人站长普遍喜欢折腾。更换主题、安装插件、卸载插件、修改设置、优化图片……一通操作下来很可能会发现,文章都还在,可是文章里面的插图都加载不出来了。

这种情况下想通过插件来解决是很困难的,因为现存的插件不一定能够对应你的需求,而且会写插件的人一般能够轻松搞定这种问题,不一定能想到这个需求。

自己动手摸索是最有用的方法,本文将会分两种情况来解决问题。

情况一,更换图床

用过一段时间 WordPress 的站长应该都听说过“动静分离”,本地服务器只执行动态请求,而将静态文件存储在对象存储中,或者通过 CDN 分发静态文件。

文章中的图片地址本应该是这种形式:

www.idcbuy.net/wp-content/uploads/2020/12/xxx.jpg

但是用过此类插件后,可能变成这样:

image.idcbuy.net/wp-content/uploads/2020/12/xxx.jpg

可以看到网址变了,因为两者指向的是不同的目标。前面一个是本地服务器,后面一个多数情况是云厂商的对象存储服务器,或者是 CDN 的加速地址。

假设我要换一家厂商的服务,或者换一个加速地址,又或者,我不想用这些服务了,希望回归到最初的状态,直接从本地服务器读取图片呢?如果文章只有少数几篇,可以手动去编辑文章,修改图片地址,但要是有几十、几百、几千篇文章呢?

最快的方法是直接修改数据库。

网上有很多教程教大家用 SQL 语句修改,如果不是资深用户,对 SQL 语句一窍不通的话,建议不要用。我们其实可以用图形工具 phpMyAdmin 来解决(之前我还写过用它来优化 WordPress 数据库的文章,点此查看)。

首先,登录到 phpMyAdmin,在左侧定位到站点所在的数据库,展开后选中 posts 表。如果没有修改过表前缀,那么应该是 wp_posts ,如下图左侧框中所示:

phpMyAdmin 批量替换图片地址
一定要选中 posts 表才能进行后续操作

接着点击上方的【搜索】,再点击【查找和替换】。在下方可以看到两个文本框,左侧填写旧图床地址,右侧填写新图床地址。如图所示,我把 image.idcbuy.net 替换成 www.idcbuy.net ,将图片地址改回到本地。

点击【执行】按钮后,网页上会显示对比预览,确认无误后再次点击【执行】,文章里的图片地址就都改好了。

情况二,更改媒体尺寸

如果之前因为换主题等原因修改过媒体缩略图尺寸,或者使用插件优化、清理过缩略图,那么文章里的图片可能还是无法加载。因为发布文章时选择的是对应尺寸的图片,之后该尺寸图片的文件不见了,自然就无法加载出来。

例如下图,图片尺寸写死在链接中:

找不到图片
圈起来的就是发布文章时选择的尺寸,现在对应的文件已经不在了

解决方法还是替换 posts 数据表中的图片链接。

不过图床地址是固定的,但是图片尺寸是不同的,例如同样是 760px 的宽度,有些图片高 250px,有些高 300px;甚至之前多次设置媒体尺寸,图片宽度也不同。这时应该如何处理呢?

幸运的是,phpMyAdmin 支持正则表达式,可以编写规则,批量适配文本。

经过观察,链接规律如下:

# 正常图片文件名
abc.jpg

# 写死尺寸的文件名
abc-760x300.jpg

我们只需要将 -760×300 删掉,也就是将 -760×300.jpg 替换成 .jpg 就行了。常见图片格式的规则如下:

# 匹配 jpg 格式
-[0-9]*x[0-9]*.jpg

# 匹配 png 格式
-[0-9]*x[0-9]*.png

# 匹配 jpeg 格式
-[0-9]*x[0-9]*.jpeg

依旧是在查找和替换的页面,注意勾选右侧“使用正则表达式”,示例如下:

phpMyAdmin 使用正则表达式替换链接

点击【执行】后,页面上同样会提供更改预览,再次点击【执行】即可完成替换。从预览页面可以看到,左侧是修改前,链接中包含尺寸,右侧是替换后,链接指向源文件。

phpMyAdmin 使用正则表达式替换链接

如果站点上有多种图片格式,可以依次复制粘贴执行。修改过后地址正确,图片即可正常加载:

地址正确,图片顺利加载

通过以上方法基本可以解决 WordPress 文章图片加载失败的问题,而且是批量处理,速度快。如果对你有帮助的话欢迎打分、评论、打赏哦~~

耕读君
耕读君

一个筋斗十万八千里,说明上云好啊

文章: 196

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注