【教程】宝塔面板:Typecho 无损迁移到 WordPress 完整教程

【教程】宝塔面板:Typecho 无损迁移到 WordPress 完整教程

时间煮雨-Master
2026-09-09 / 0 评论 / 1 阅读 / 正在检测是否收录...

宝塔面板:Typecho 无损迁移到 WordPress 完整教程

适用环境:宝塔面板(BT Panel)+ Typecho(任意版本)+ 全新 WordPress 站点
目标:文章、页面、分类、标签、评论(含楼层)、用户(含原密码)、附件、自定义字段全部保留,且旧链接 301 跳转保护 SEO。

目录

  1. 迁移前必做:备份
  2. 两种方案对比
  3. 宝塔面板准备工作
  4. 一键迁移工具使用步骤
  5. 迁移后必做的 8 件事
  6. 数据映射对照表
  7. 常见问题与排查
  8. 回滚方案

一、迁移前必做:备份

这一步不能省。 迁移会直接写入 WordPress 数据库,操作失误有风险。

  1. 备份 Typecho 站点

    • 宝塔 → 网站 → 找到 Typecho 站点 → 「备份」→ 立即备份(同时勾上文件和数据库)
    • 或者:文件 → 打包 /www/wwwroot/你的typecho目录;数据库 → phpMyAdmin 导出 SQL
  2. 备份 Typecho 数据库单独存一份

    • 宝塔 → 数据库 → 对应数据库 → 「备份」/「导出」
    • 建议下载到本地或 OSS,别只留在服务器上
  3. 记录关键信息(后面要用)

    • Typecho 站点根目录路径,例如 /www/wwwroot/typecho.example.com
    • Typecho 数据库名 / 用户名 / 密码 / 表前缀(一般是 typecho_
    • 查看表前缀:打开 Typecho 根目录下的 config.inc.php,找这一行:

      $db = new Typecho_Db('Mysql', 'typecho_');   // 第二个参数就是表前缀

二、两种方案对比

方案能迁移什么丢什么耗时推荐度
WordPress 自带 RSS 导入文章正文、标题、分类、标签、作者评论、附件、自定义字段、页面层级、用户密码、文章 ID5 分钟⭐ 只适合纯文章、不在乎评论
数据库转换脚本(本文工具)全部:用户/密码/文章/页面/评论/楼层/附件/自定义字段/ID 映射Typecho 主题与插件(无法迁移,本来也不通用)15~30 分钟⭐⭐⭐⭐⭐

结论:想要"无损",只能走数据库级别转换。下面给的 typecho2wp 工具就是干这个的。


三、宝塔面板准备工作

3.1 新建一个 WordPress 站点

  1. 宝塔 → 网站 → 添加站点

    • 域名:建议先用临时域名或二级域名,例如 wp.example.com(这样能边迁移边对比,确认无误后再换到主域名)
    • 数据库:选 MySQL,同时创建数据库,记下库名/用户名/密码
    • PHP 版本:7.4 / 8.0 / 8.1 均可(不要用 5.x,WordPress 新版已不支持)
  2. 站点创建完成后,下载 WordPress 中文版解压到站点根目录,或直接:

    cd /www/wwwroot/wp.example.com
    wget https://cn.wordpress.org/latest-zh_CN.zip
    unzip latest-zh_CN.zip && mv wordpress/* . && rm -rf wordpress latest-zh_CN.zip
  3. 浏览器访问站点完成 WordPress 安装(记得记下管理员账号密码)。

    建议管理员用户名不要和 Typecho 里的用户名一样,避免冲突(工具检测到重名会自动加后缀,没问题)。

3.2 关闭 open_basedir(关键!)

这是最容易踩的坑。 宝塔默认开启「防跨站攻击(open_basedir)」,会导致工具读不到另一个站点的文件,表现为:

  • 自动读取配置时提示"找不到 config.inc.php"
  • 附件迁移时全部提示"源文件不存在"

解决办法(迁移期间临时关闭,做完再开回来):

  • 方法 A:宝塔 → 网站 → 站点设置 → 网站目录 → 取消勾选「防跨站攻击(open_basedir)」→ 保存
  • 方法 B:删除站点根目录下的 .user.ini 文件(改名即可,例如改成 .user.ini.bak),改完需要等约 5 分钟或重启 PHP 服务才生效
Typecho 站点和 WordPress 站点两边都要关

3.3 放宽 PHP 限制(大站点必做)

宝塔 → 软件商店 → 对应 PHP 版本 → 配置修改 / 性能调整:

max_execution_time = 300
memory_limit       = 512M
post_max_size      = 64M
upload_max_filesize = 64M

改完重启 PHP。


四、一键迁移工具使用步骤

4.1 上传工具

typecho2wp 整个目录上传到 WordPress 站点根目录index.phpParsedown.php 要在同一层):

/www/wwwroot/wp.example.com/typecho2wp/
├── index.php
└── Parsedown.php

浏览器访问:http://wp.example.com/typecho2wp/index.php

安全提示

  • 工具目录任何人都能访问,用完必须删除
  • 若需加口令:编辑 index.php 顶部,把
    define('T2W_ACCESS_KEY', '');
    改成 define('T2W_ACCESS_KEY', '你自己的口令');,之后用 ?key=你自己的口令 访问。
  • 迁移期间生成的 .t2w_state.json 里含数据库密码,删除工具时一并删掉。

4.2 第一步:填写路径,自动读配置

  • Typecho 站点根目录:/www/wwwroot/typecho.example.com
  • WordPress 站点根目录:/www/wwwroot/wp.example.com

点「自动读取配置」,工具会解析两边的 config.inc.phpwp-config.php,自动填好数据库信息。

逐项核对:主机、端口、库名、用户、密码、表前缀、根目录。表前缀填错会直接报错。

4.3 第二步:选择迁移选项

选项说明建议
正文处理方式Markdown 转 HTML:把 Typecho 的 Markdown 正文渲染成 HTML,迁移后不依赖任何插件✅ 推荐选这个
保留 Markdown 原文:保留源文件,但 WordPress 原生不渲染 Markdown,必须装插件(如 WP Githuber MD)想继续用 Markdown 写作才选
用户密码处理保留原密码:把 Typecho 的哈希原样写入,并生成一个兼容插件,老用户可以用原来的密码直接登录,登录成功后自动升级为 WordPress 哈希✅ 强烈推荐
重置为随机密码:给每个用户生成新密码,迁移结束后在报告里查看不装插件时选
迁移附件到媒体库/usr/uploads 的附件复制到 wp-content/uploads/年/月/,写入媒体库,并重写正文里的图片地址✅ 勾选
兜底复制遗留文件/usr/uploads 里没被媒体库收录的文件(比如你手动 FTP 上传的),复制到 wp-content/uploads/typecho-legacy/,正文地址一并重写✅ 勾选
同步站点标题把 Typecho 的站点名称、副标题同步到 WordPress✅ 勾选
清空 WordPress 现有内容删除目标站点现有的文章/页面/附件/分类/标签/评论全新安装的 WP 勾选;已有内容千万别勾

点「测试连接并预览」,能看到 Typecho 的文章/页面/附件/分类/标签/评论/用户数量,确认无误后进入下一步。

4.4 第三步:执行迁移

点「开始迁移」,页面会实时显示 12 个阶段的进度:

用户与权限 → 分类与标签 → 分类层级 → 文章与页面 → 自定义字段
→ 附件与媒体库 → 正文地址重写 → 父级页面与特色图 → 文章-分类关联
→ 评论 → 评论楼层 → 统计修正

大站点(几千篇文章 + 几千条评论)可能要几分钟到十几分钟,不要关闭页面

4.5 第四步:收尾

迁移完成后工具会自动生成这些文件(在 typecho2wp/t2w-output/):

文件作用
t2w-redirect-map.php旧链接 → 新链接 的映射表
t2w-301-redirect.phpWordPress 必用插件(mu-plugin),旧链接自动 301 跳转
t2w-password-compat.php密码兼容插件(选了"保留原密码"才有)
nginx-rewrite.confNginx 版 301 规则,可贴到宝塔「伪静态」
htaccess-redirect.txtApache 版 301 规则
migration-report.txt迁移报告(含新密码列表)

如果 WordPress 目录可写,工具会自动把前三个部署到 wp-content/mu-plugins/。没有自动部署的话手动放过去:

mkdir -p /www/wwwroot/wp.example.com/wp-content/mu-plugins
cp t2w-output/t2w-redirect-map.php  /www/wwwroot/wp.example.com/wp-content/mu-plugins/
cp t2w-output/t2w-301-redirect.php  /www/wwwroot/wp.example.com/wp-content/mu-plugins/
cp t2w-output/t2w-password-compat.php /www/wwwroot/wp.example.com/wp-content/mu-plugins/
mu-plugins 是"必用插件",后台插件列表里看不到,但一直生效。想停用直接删文件。

五、迁移后必做的 8 件事

1. 固定链接保存一次

WordPress 后台 → 设置 → 固定链接 → 直接点「保存更改」(什么都不用改)。
作用:刷新重写规则缓存,否则新链接可能 404。

推荐结构:/%post_id%.html(和 Typecho 的 /archives/123/ 一样稳定)或 /archives/%post_id%/

2. 验证 301 跳转

curl -I https://example.com/archives/123/

应该返回 HTTP/1.1 301 Moved PermanentlyLocation: https://example.com/新链接

也可以浏览器直接打开几个旧链接试试。

3. 把旧站点改成跳转到新站(可选)

确认无误后,在 Typecho 站点(或主域名)加一条 Nginx 规则,把全站跳转到新站:

# 全站跳转(放在 Typecho 站点的 nginx 配置里)
location / {
    return 301 https://新域名$request_uri;
}

之后再让旧链接的 301 规则在新站生效(顺序:先全站跳到新站,新站内部再按 map 跳到具体新地址)。

更简单的做法:直接把新 WordPress 站点换成主域名,旧链接由 mu-plugin 处理。

4. 检查正文与图片

随便打开几篇文章,重点看:

  • 代码块、表格、引用是否正常
  • 图片是否能显示(右键复制图片地址,看是不是 wp-content/uploads/年/月/xxx.jpg
  • 若图片显示为旧地址 /usr/uploads/...,说明附件阶段没跑成功,检查 open_basedir

5. 恢复 open_basedir

回到宝塔,把两个站点的「防跨站攻击」重新勾上,或把 .user.ini.bak 改回 .user.ini

6. 检查用户与评论

  • 后台 → 用户:确认用户都在,角色正确
  • 后台 → 评论:确认评论在,层级(回复关系)正常
  • 原密码登录一次验证(选了密码兼容的话)

7. 主题、插件、小工具需要重来

Typecho 的主题和插件不能迁移到 WordPress,需要重新选择:

  • 主题:WordPress 后台 → 外观 → 主题
  • 常用替代:SEO(Rank Math / Yoast)、缓存(WP Rocket / WP Super Cache)、站点地图、图床

8. SEO 收尾

  • 搜索引擎站长平台提交 sitemap
  • 百度搜索资源平台 → 网站改版 → 提交规则(如果 URL 规则变了)
  • 保留 301 至少 3~6 个月

9. 删除工具(重要)

rm -rf /www/wwwroot/wp.example.com/typecho2wp

六、数据映射对照表

Typecho 表WordPress 表说明
typecho_userswp_users + wp_usermeta用户名/昵称/邮箱/角色(administrator、editor、contributor、subscriber 对应)
typecho_metas(type=category)wp_terms + wp_term_taxonomy(category)保留名称、别名、描述、层级
typecho_metas(type=tag)wp_terms + wp_term_taxonomy(post_tag)同上
typecho_contents(type=post)wp_posts(post_type=post)标题、别名、正文、发布时间、修改时间、状态、评论开关、密码
typecho_contents(type=page)wp_posts(post_type=page)额外保留模板字段 → _wp_page_template
typecho_contents(type=attachment)wp_posts(post_type=attachment)+ 媒体库文件复制到 uploads/年/月/,写入 _wp_attached_file_wp_attachment_metadata
typecho_commentswp_comments昵称、邮箱、网址、IP、UA、时间、审核状态、楼层
typecho_relationshipswp_term_relationships文章 ↔ 分类/标签 关联
typecho_fieldswp_postmeta自定义字段原样保留(如 views、thumb)
typecho_options(title/description)wp_options(blogname/blogdescription)站点标题与副标题

状态映射:

TypechoWordPress
publishpublish(已发布)
draftdraft(草稿)
waitingpending(待审核)
hiddenprivate(私密)
privateprivate(私密)

正文处理:

  • Typecho 在正文前加了 <!--markdown--> 标记,工具会自动去掉
  • <!--more--> 之前的内容会写入 WordPress 的「摘要」字段
  • 选择"转 HTML"时用 Parsedown 渲染

七、常见问题与排查

Q1:提示"找不到 config.inc.php" / "源文件不存在"

99% 是 open_basedir 限制。回到 3.2 节 关掉它,重启 PHP 或等 5 分钟。
另外确认路径写的是站点根目录(里面有 config.inc.php 的那一层),不是 usradmin 目录。

Q2:提示"Typecho 数据库中找不到表:xxx_contents"

表前缀填错。打开 config.inc.php 确认,常见有 typecho_te_tc_

Q3:数据库连接失败

  • 确认数据库主机:同服务器一般填 localhost(不是 127.0.0.1,有些环境 socket 路径不同)
  • 确认数据库用户有该库的读写权限
  • 宝塔 → 数据库 → 检查 root 密码或站库用户密码

Q4:正文里的图片还是旧地址

  • 检查 wp-content/uploads/ 下有没有文件
  • 若没有 → open_basedir 或 /usr/uploads 目录已被删
  • 若有但地址没变 → 手动执行一遍替换(用插件 Better Search Replace,把 你的域名/usr/uploads 替换为 你的域名/wp-content/uploads/typecho-legacy

Q5:中文别名(slug)变成了乱码或空

工具会优先使用 Typecho 的 slug 字段;为空时用标题生成。中文别名 WordPress 是支持的,但如果你的固定链接用了 %postname%,建议后台重新编辑一下别名。

Q6:迁移后文章数量对不上

  • 检查 Typecho 里有没有 type=attachment 或插件自定义的 type(如 link),这些不会作为文章
  • 检查是否有草稿/私密文章,WordPress 后台默认筛选器可能没显示

Q7:评论楼层乱了

工具会做两遍处理(先插评论,再修正 comment_parent)。如果中途中断,重新跑一次完整的迁移即可(先回滚)。

Q8:老用户登不上

  • 确认 wp-content/mu-plugins/t2w-password-compat.php 存在
  • 确认用户表里的 user_pass$T$ 开头(新版 Typecho)或 32 位 md5(旧版)
  • 还不行就直接用「忘记密码」重置

Q9:执行到一半页面卡住/500

  • 大站点把 PHP 的 max_execution_time 调到 300、memory_limit 512M
  • 检查 Nginx 的 fastcgi_read_timeout,建议 300
  • 工具是分批 AJAX,中断后重新执行完整流程前先回滚

Q10:能迁移到已有的 WordPress 站点吗?

可以,但不要勾选「清空 WordPress 现有内容」。注意文章 ID 会重新分配,可能与现有文章冲突(工具会自动处理,但固定链接需要重新保存)。


八、回滚方案

方案 A:用工具回滚
工具右下角有「回滚本次迁移」按钮,会删除本次插入的全部文章/分类/评论/用户(不影响 WordPress 原有内容)。

方案 B:恢复数据库备份
宝塔 → 数据库 → 选中 WordPress 数据库 → 「导入」/ 从备份恢复,恢复到迁移前的状态。

方案 C:重来
回滚后重新执行迁移即可,工具支持重复运行(只要先回滚或先清空)。


附:手动方案(不推荐,作为备选)

如果你实在不想用工具,最低限度的手动迁移路径是:

  1. Typecho 后台安装导出插件,或直接用 WordPress 自带的 RSS 导入(工具 → 导入 → RSS)
  2. 导入后:文章正文、标题、分类、标签、作者能过来
  3. 然后手动补:评论(需要额外 SQL)、附件(FTP 复制 + 批量替换数据库地址)、用户(重建)
  4. 301 规则手写

缺点是评论、附件、自定义字段、用户密码基本都得手动折腾,几千条数据会非常痛苦。建议直接用工具。

0

评论 (0)

取消