问题背景
用 WXR 工具迁移 WordPress 后,文章缩略图全部消失。原因:
- WXR 导入后附件 ID 发生变化,
_thumbnail_id指向的附件在新库中不存在 - 图片文件存储在腾讯云 COS,本地无文件
一、理解缩略图的加载逻辑
Puock 主题按以下优先级获取缩略图:
_thumbnail_id(特色图)- →
external_thumbnail_url(外部图片 URL) - → 文章内容第一张图
- → 随机默认图
修复思路:删除无效的 _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)。
正文完