宝塔面板:Typecho 无损迁移到 WordPress 完整教程
适用环境:宝塔面板(BT Panel)+ Typecho(任意版本)+ 全新 WordPress 站点
目标:文章、页面、分类、标签、评论(含楼层)、用户(含原密码)、附件、自定义字段全部保留,且旧链接 301 跳转保护 SEO。
目录
一、迁移前必做:备份
这一步不能省。 迁移会直接写入 WordPress 数据库,操作失误有风险。
备份 Typecho 站点
- 宝塔 → 网站 → 找到 Typecho 站点 → 「备份」→ 立即备份(同时勾上文件和数据库)
- 或者:文件 → 打包
/www/wwwroot/你的typecho目录;数据库 → phpMyAdmin 导出 SQL
备份 Typecho 数据库单独存一份
- 宝塔 → 数据库 → 对应数据库 → 「备份」/「导出」
- 建议下载到本地或 OSS,别只留在服务器上
记录关键信息(后面要用)
- Typecho 站点根目录路径,例如
/www/wwwroot/typecho.example.com - Typecho 数据库名 / 用户名 / 密码 / 表前缀(一般是
typecho_) 查看表前缀:打开 Typecho 根目录下的
config.inc.php,找这一行:$db = new Typecho_Db('Mysql', 'typecho_'); // 第二个参数就是表前缀
- Typecho 站点根目录路径,例如
二、两种方案对比
| 方案 | 能迁移什么 | 丢什么 | 耗时 | 推荐度 |
|---|---|---|---|---|
| WordPress 自带 RSS 导入 | 文章正文、标题、分类、标签、作者 | 评论、附件、自定义字段、页面层级、用户密码、文章 ID | 5 分钟 | ⭐ 只适合纯文章、不在乎评论 |
| 数据库转换脚本(本文工具) | 全部:用户/密码/文章/页面/评论/楼层/附件/自定义字段/ID 映射 | Typecho 主题与插件(无法迁移,本来也不通用) | 15~30 分钟 | ⭐⭐⭐⭐⭐ |
结论:想要"无损",只能走数据库级别转换。下面给的 typecho2wp 工具就是干这个的。
三、宝塔面板准备工作
3.1 新建一个 WordPress 站点
宝塔 → 网站 → 添加站点
- 域名:建议先用临时域名或二级域名,例如
wp.example.com(这样能边迁移边对比,确认无误后再换到主域名) - 数据库:选 MySQL,同时创建数据库,记下库名/用户名/密码
- PHP 版本:7.4 / 8.0 / 8.1 均可(不要用 5.x,WordPress 新版已不支持)
- 域名:建议先用临时域名或二级域名,例如
站点创建完成后,下载 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浏览器访问站点完成 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.php 和 Parsedown.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.php 和 wp-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.php | WordPress 必用插件(mu-plugin),旧链接自动 301 跳转 |
t2w-password-compat.php | 密码兼容插件(选了"保留原密码"才有) |
nginx-rewrite.conf | Nginx 版 301 规则,可贴到宝塔「伪静态」 |
htaccess-redirect.txt | Apache 版 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 Permanently 和 Location: 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_users | wp_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_comments | wp_comments | 昵称、邮箱、网址、IP、UA、时间、审核状态、楼层 |
typecho_relationships | wp_term_relationships | 文章 ↔ 分类/标签 关联 |
typecho_fields | wp_postmeta | 自定义字段原样保留(如 views、thumb) |
typecho_options(title/description) | wp_options(blogname/blogdescription) | 站点标题与副标题 |
状态映射:
| Typecho | WordPress |
|---|---|
publish | publish(已发布) |
draft | draft(草稿) |
waiting | pending(待审核) |
hidden | private(私密) |
private | private(私密) |
正文处理:
- Typecho 在正文前加了
<!--markdown-->标记,工具会自动去掉 <!--more-->之前的内容会写入 WordPress 的「摘要」字段- 选择"转 HTML"时用 Parsedown 渲染
七、常见问题与排查
Q1:提示"找不到 config.inc.php" / "源文件不存在"
99% 是 open_basedir 限制。回到 3.2 节 关掉它,重启 PHP 或等 5 分钟。
另外确认路径写的是站点根目录(里面有 config.inc.php 的那一层),不是 usr 或 admin 目录。
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_limit512M - 检查 Nginx 的
fastcgi_read_timeout,建议 300 - 工具是分批 AJAX,中断后重新执行完整流程前先回滚
Q10:能迁移到已有的 WordPress 站点吗?
可以,但不要勾选「清空 WordPress 现有内容」。注意文章 ID 会重新分配,可能与现有文章冲突(工具会自动处理,但固定链接需要重新保存)。
八、回滚方案
方案 A:用工具回滚
工具右下角有「回滚本次迁移」按钮,会删除本次插入的全部文章/分类/评论/用户(不影响 WordPress 原有内容)。
方案 B:恢复数据库备份
宝塔 → 数据库 → 选中 WordPress 数据库 → 「导入」/ 从备份恢复,恢复到迁移前的状态。
方案 C:重来
回滚后重新执行迁移即可,工具支持重复运行(只要先回滚或先清空)。
附:手动方案(不推荐,作为备选)
如果你实在不想用工具,最低限度的手动迁移路径是:
- Typecho 后台安装导出插件,或直接用 WordPress 自带的 RSS 导入(工具 → 导入 → RSS)
- 导入后:文章正文、标题、分类、标签、作者能过来
- 然后手动补:评论(需要额外 SQL)、附件(FTP 复制 + 批量替换数据库地址)、用户(重建)
- 301 规则手写
缺点是评论、附件、自定义字段、用户密码基本都得手动折腾,几千条数据会非常痛苦。建议直接用工具。
评论 (0)