记录一下从WordPress迁移到Typecho的操作过程
最近把一个在 WordPress 的老站点迁移到 Typecho ,使用的是 WordPress to Typecho 插件,遇到些问题特此记录一下。
最后看了一下 WordPress to Typecho 插件在github的最近更新时间是五年前了怪不得有点问题。
旧站环境是:
- WordPress 版本忘记了,指定不是最新的。
- 主题: 子比主题 8.1
新站环境是:
- Typecho 1.3.0
- 主题: Facile
- PHP: 8.2
- Mysql 5.7
原本以为直接安装插件、填写数据库信息、点击导入就可以完成迁移,结果实际使用中遇到了不少问题,比如:
迁移失败,提示 Server Error
迁移数据不完整
导入后 Typecho 首页打不开
后台评论页面打开提示 Server Error
后台分类后面的文章数量和实际文章数不一致
后台编辑文章时提示“这篇文章不是由 Markdown 语法创建的”
图片附件需要手动迁移并替换文章中的旧地址
数据库需要清理无效数据并优化
所以这次对原来的 WordPress to Typecho 插件做了一些兼容性修复和数据修复处理。为了区分原版,这里把版本号改为:1.1.3 Beta
下载地址:https://github.com/227qidian/WordPress-to-Typecho
WordPress to Typecho
将 WordPress 数据库中的文章、页面、评论、分类、标签等数据转换到 Typecho 。
这次修复版主要针对:
- Typecho 1.3.0
- PHP 8.2
- WordPress 子比主题 8.1
- Typecho Facile 主题环境 (理论其他主题也可以使用)
原版插件在旧版本 Typecho 中可能还能使用,但在 Typecho 1.3.0 环境下会遇到不少兼容性问题,所以本次主要做的是兼容新版 Typecho 和修复迁移后的数据异常。
插件修改了哪些问题?
这次迁移过程中,确实对插件做了修改,主要修复了下面这些问题。
- 修复 Typecho 1.3.0 类名兼容问题,避免因为类名不兼容导致 Server Error 。
- 修复 PHP 8.2 下导入失败的问题。
- 修复插件入口未定义变量问题。
- 修复导入后首页 Server Error
导入后首页打不开,主要原因是文章的 authorId 使用了 WordPress 原来的用户 ID。
修复后,所有导入文章统一绑定到当前 Typecho 管理员账号,避免首页因作者 ID 不存在而报错。 - 修复文章和分类字段不完整的问题
- 修复后台评论页面 Server Error
迁移后点击后台:管理 -> 评论
如果出现 Server Error ,多数情况下是因为评论表中存在“孤儿评论”。 - 修复后台分类文章数量不准确
使用教程
下载修复后的插件
上传到 Typecho 插件目录:/usr/plugins/
进入 Typecho 后台:控制台 -> 插件
启用 WordPress to Typecho 插件
点击插件设置,填写 WordPress 数据库信息:
- 数据库地址
- 数据库端口
- 数据库用户名
- 数据库密码
- 数据库名
- WordPress 数据表前缀
保存设置
在后台菜单中进入:从 WordPress 导入数据
点击开始导入
导入完成后,可以检查:
- 首页是否正常
- 文章是否正常
- 分类是否正常
- 标签是否正常
- 评论页面是否正常
- 图片是否正常显示
确认无误后,可以禁用插件
导入完成后,这个插件就不需要一直启用了。禁用插件不会影响已经导入的数据。
注意事项
导入前一定要备份数据库
1、子比主题的数据可能不会全部导入
子比主题可能存在自定义文章类型,比如资源、商品、视频等内容。
本插件主要导入 WordPress 的:
post、page也就是普通文章和页面。
如果你在 WordPress 里有大量子比主题自定义内容,需要单独确认是否需要迁移。
如果只迁移普通文章和页面,那么这是正常情况,不一定是插件漏导。
2、图片附件不会自动迁移
这个插件只转换数据库,不会自动复制图片、附件文件。
需要手动把 WordPress 的上传目录:wp-content/uploads
复制到 Typecho 的上传目录:usr/uploads
然后再使用 SQL 替换文章内容里的图片地址。
例如:
UPDATE typecho_contents
SET text = REPLACE(text, 'https://你的域名/wp-content/uploads', 'https://你的域名/usr/uploads');
UPDATE typecho_contents
SET text = REPLACE(text, 'https://你的域名/wp-content/uploads', 'https://你的域名/usr/uploads');
如果执行后提示影响 0 行,说明文章内容里没有匹配到这段地址。
这时需要先查看文章源码里真实的图片地址格式,可能是完整域名、CDN 地址,或者其他路径。
3、后台编辑文章提示不是 Markdown 创建的
迁移过来的 WordPress 文章一般是 HTML 内容。
Typecho 后台使用 Markdown 编辑器打开时,可能会提示:这篇文章不是由 Markdown 语法创建的,继续使用 Markdown 编辑它吗?
如果想取消这个提示,可以给文章内容添加 Typecho 的 Markdown 标记:
UPDATE typecho_contents
SET text = CONCAT('<!--markdown-->', text)
WHERE type IN ('post', 'page')
AND text NOT LIKE '<!--markdown-->%';
UPDATE typecho_contents
SET text = CONCAT('<!--markdown-->', text)
WHERE type IN ('post', 'page')
AND text NOT LIKE '<!--markdown-->%';
注意:
这只是让 Typecho 识别为 Markdown 文章,不会自动把 WordPress HTML 转成 Markdown。
4、评论页面 Server Error 的处理方法
如果后台评论页面仍然出现 Server Error ,可以先检查是否还有孤儿评论:
SELECT COUNT(*) AS orphan_comments
FROM typecho_comments c
LEFT JOIN typecho_contents t ON c.cid = t.cid
WHERE t.cid IS NULL;
SELECT COUNT(*) AS orphan_comments
FROM typecho_comments c
LEFT JOIN typecho_contents t ON c.cid = t.cid
WHERE t.cid IS NULL;
如果数量大于 0 ,可以删除这些无效评论:
DELETE c FROM typecho_comments c
LEFT JOIN typecho_contents t ON c.cid = t.cid
WHERE t.cid IS NULL;
DELETE c FROM typecho_comments c
LEFT JOIN typecho_contents t ON c.cid = t.cid
WHERE t.cid IS NULL;
再修复一下可能为空的字段:
UPDATE typecho_comments SET mail = '' WHERE mail IS NULL;
UPDATE typecho_comments SET ip = '' WHERE ip IS NULL;
UPDATE typecho_comments SET agent = '' WHERE agent IS NULL;
UPDATE typecho_comments SET url = '' WHERE url IS NULL;
UPDATE typecho_comments SET mail = '' WHERE mail IS NULL;
UPDATE typecho_comments SET ip = '' WHERE ip IS NULL;
UPDATE typecho_comments SET agent = '' WHERE agent IS NULL;
UPDATE typecho_comments SET url = '' WHERE url IS NULL;
5、分类文章数不对的处理方法
如果后台分类后面的文章数和实际不一致,可以执行:
DELETE r FROM typecho_relationships r
LEFT JOIN typecho_contents c ON r.cid = c.cid
WHERE c.cid IS NULL;
UPDATE typecho_metas m
SET m.count = (
SELECT COUNT(*)
FROM typecho_relationships r
JOIN typecho_contents c ON r.cid = c.cid
WHERE r.mid = m.mid
AND c.status = 'publish'
AND c.type IN ('post', 'page')
);
DELETE r FROM typecho_relationships r
LEFT JOIN typecho_contents c ON r.cid = c.cid
WHERE c.cid IS NULL;
UPDATE typecho_metas m
SET m.count = (
SELECT COUNT(*)
FROM typecho_relationships r
JOIN typecho_contents c ON r.cid = c.cid
WHERE r.mid = m.mid
AND c.status = 'publish'
AND c.type IN ('post', 'page')
);
修复版插件已经加入了这个逻辑。
如果是使用修复前的插件导入,可以手动执行上面的 SQL。
6、迁移后可以优化数据库
如果迁移过程中执行过多次删除、替换、更新操作,可以最后优化一下数据库:
OPTIMIZE TABLE typecho_contents;
OPTIMIZE TABLE typecho_comments;
OPTIMIZE TABLE typecho_metas;
OPTIMIZE TABLE typecho_relationships;
OPTIMIZE TABLE typecho_contents;
OPTIMIZE TABLE typecho_comments;
OPTIMIZE TABLE typecho_metas;
OPTIMIZE TABLE typecho_relationships;
这个不是必须操作,但迁移完成后执行一次会更干净。
常见问题
- 为什么提示迁移成功,但数据不全?
大概率是 WordPress 里有自定义文章类型。
插件默认只导入 post 和 page ,不会自动导入所有主题自定义内容。
- 为什么迁移后首页 Server Error?
可能是authorId对不上。
WordPress 用户 ID 和 Typecho 用户 ID 不一致,文章作者不存在就可能导致页面报错。
修复版已经统一把导入文章作者设置为当前 Typecho 管理员。
- 为什么评论后台 Server Error?
多半是有评论指向不存在的文章。
也就是评论导入了,但文章没有导入。
修复版已经过滤了这类评论。
- 为什么分类数量不准?
因为 WordPress 的分类统计口径和 Typecho 不一样。
尤其是子比主题这类主题,自定义文章类型会影响分类计数。
修复版已经在导入后重新统计分类和标签数量。
- 导入完成后插件还能删吗?
可以。
导入完成并确认数据正常后,可以禁用插件。
插件只是负责迁移数据,不影响 Typecho 正常运行。
总结
修复版 1.1.3 Beta 主要解决了这些兼容性和数据清理问题,让迁移过程更适合新版 Typecho 环境。
有没有更简单的办法?
还真有。在论坛发现了一个插件 清理优化插件 CleanTools V1.0.4(20260326 更新) - Typecho Forum 应该也可以使用解决问题。不想麻烦的朋友可以试一下
版权声明:本文为原创文章,版权归 天凉好个秋 所有,转载请联系博主获得授权。
本文地址:https://beicb.top/archives/3048.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。