WordPress 迁移实战(下)——缩略图丢失的完整修复流程

3次阅读
没有评论

问题背景

用 WXR 工具迁移 WordPress 后,文章缩略图全部消失。原因:

  • WXR 导入后附件 ID 发生变化,_thumbnail_id 指向的附件在新库中不存在
  • 图片文件存储在腾讯云 COS,本地无文件

一、理解缩略图的加载逻辑

Puock 主题按以下优先级获取缩略图:

  1. _thumbnail_id(特色图)
  2. external_thumbnail_url(外部图片 URL)
  3. → 文章内容第一张图
  4. → 随机默认图

修复思路:删除无效的 _thumbnail_id,改用 external_thumbnail_url 直接存储 COS 图片地址。

二、诊断当前状态

-- 1. 有多少篇文章设置了特色图
SELECT COUNT(*) FROM wp_postmeta WHERE meta_key = '_thumbnail_id';

-- 2. 新库中有多少附件记录
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'attachment';

-- 3. 有多少 _thumbnail_id 指向不存在的附件(无效记录)
SELECT COUNT(*) FROM wp_postmeta pm
LEFT JOIN wp_posts p2 ON p2.ID = pm.meta_value AND p2.post_type = 'attachment'
WHERE pm.meta_key = '_thumbnail_id' AND p2.ID IS NULL;

如果第 3 条结果 = 第 1 条结果,说明所有特色图记录全部失效,需要全部清除并重建。

三、从旧库迁移缩略图 URL

前提:旧库和新库在同一台服务器,用 root 账号登录 phpMyAdmin。

预览(确认数据正确后再执行写入):

USE lifetruth;

SELECT new_p.post_name, old_p2.guid AS thumbnail_url
FROM wp_posts new_p
JOIN `旧`.wp_posts old_p ON old_p.post_name = new_p.post_name
JOIN `旧`.wp_postmeta old_pm ON old_pm.post_id = old_p.ID AND old_pm.meta_key = '_thumbnail_id'
JOIN `旧`.wp_posts old_p2 ON old_p2.ID = old_pm.meta_value AND old_p2.post_type = 'attachment'
WHERE new_p.post_status = 'publish';

确认无误后,正式写入:

INSERT INTO lifetruth.wp_postmeta (post_id, meta_key, meta_value)
SELECT new_p.ID, 'external_thumbnail_url', old_p2.guid
FROM lifetruth.wp_posts new_p
JOIN `旧`.wp_posts old_p ON old_p.post_name = new_p.post_name
JOIN `旧`.wp_postmeta old_pm ON old_pm.post_id = old_p.ID AND old_pm.meta_key = '_thumbnail_id'
JOIN `旧`.wp_posts old_p2 ON old_p2.ID = old_pm.meta_value AND old_p2.post_type = 'attachment'
WHERE new_p.post_status = 'publish';

四、删除无效的 _thumbnail_id

DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p2 ON p2.ID = pm.meta_value AND p2.post_type = 'attachment'
WHERE pm.meta_key = '_thumbnail_id' AND p2.ID IS NULL;

删除后,主题会跳过特色图检查,直接读取 external_thumbnail_url

五、修复 timthumb 域名问题

问题原因:timthumb 检测到图片 URL 的域名与当前站点相同,会把它当作本地文件路径处理,导致报错:

Could not find the internal image you specified.

解决方案:把 external_thumbnail_url 里的站内域名替换成 COS 存储桶域名:

UPDATE wp_postmeta
SET meta_value = REPLACE(
 meta_value,
 'https://lifetruth.top/wp-content/uploads/',
 'https://lifetruth-1258719200.cos.ap-guangzhou.myqcloud.com/wp-content/uploads/'
)
WHERE meta_key = 'external_thumbnail_url';

同时在 外观 → Puock设置 → 全局设置 → 缩略图白名单 添加:

lifetruth-1258719200.cos.ap-guangzhou.myqcloud.com

六、清除缓存

DELETE FROM wp_options WHERE option_name LIKE '_transient_%puock%';
DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%puock%';

同时清除 LiteSpeed Cache 全部缓存,在宝塔面板文件管理器删除:

/wp-content/themes/wordpress-theme-puock-master/cache/thumbnail/

下的所有文件,然后强制刷新页面(Ctrl+Shift+R)。

正文完
 0
评论(没有评论)