AI摘要

本文记录了从WordPress迁移到Typecho的过程,针对原版插件在Typecho 1.3.0和PHP 8.2下的兼容性问题,作者修复并发布了WordPress to Typecho 1.1.3 Beta版,解决了导入失败、数据异常等错误,并分享了使用教程及手动迁移图片等注意事项。

最近把一个在 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 和修复迁移后的数据异常。

插件修改了哪些问题?

这次迁移过程中,确实对插件做了修改,主要修复了下面这些问题。

  1. 修复 Typecho 1.3.0 类名兼容问题,避免因为类名不兼容导致 Server Error 。
  2. 修复 PHP 8.2 下导入失败的问题。
  3. 修复插件入口未定义变量问题。
  4. 修复导入后首页 Server Error
    导入后首页打不开,主要原因是文章的 authorId 使用了 WordPress 原来的用户 ID。
    修复后,所有导入文章统一绑定到当前 Typecho 管理员账号,避免首页因作者 ID 不存在而报错。
  5. 修复文章和分类字段不完整的问题
  6. 修复后台评论页面 Server Error
    迁移后点击后台:管理 -> 评论
    如果出现 Server Error ,多数情况下是因为评论表中存在“孤儿评论”。
  7. 修复后台分类文章数量不准确

使用教程

下载修复后的插件

上传到 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;

这个不是必须操作,但迁移完成后执行一次会更干净。

常见问题

  1. 为什么提示迁移成功,但数据不全?

大概率是 WordPress 里有自定义文章类型。
插件默认只导入 postpage ,不会自动导入所有主题自定义内容。

  1. 为什么迁移后首页 Server Error?
    可能是 authorId 对不上。
    WordPress 用户 ID 和 Typecho 用户 ID 不一致,文章作者不存在就可能导致页面报错。

修复版已经统一把导入文章作者设置为当前 Typecho 管理员。

  1. 为什么评论后台 Server Error?
    多半是有评论指向不存在的文章。
    也就是评论导入了,但文章没有导入。

修复版已经过滤了这类评论。

  1. 为什么分类数量不准?
    因为 WordPress 的分类统计口径和 Typecho 不一样。
    尤其是子比主题这类主题,自定义文章类型会影响分类计数。

修复版已经在导入后重新统计分类和标签数量。

  1. 导入完成后插件还能删吗?
    可以。
    导入完成并确认数据正常后,可以禁用插件。
    插件只是负责迁移数据,不影响 Typecho 正常运行。

总结

修复版 1.1.3 Beta 主要解决了这些兼容性和数据清理问题,让迁移过程更适合新版 Typecho 环境。

有没有更简单的办法?

还真有。在论坛发现了一个插件 清理优化插件 CleanTools V1.0.4(20260326 更新) - Typecho Forum 应该也可以使用解决问题。不想麻烦的朋友可以试一下