⭐ 推荐:社区规则条款 V1.0

从WordPress迁移到Typecho数据转换有哪些坑?

GJ论坛站长
GJ论坛站长 管理员资深会员 👑黑卡会员
发布于 2026-10-25 06:22 ·4 浏览 ·4 回复
内容摘要

WordPress 迁移到 Typecho 的最大坑是表结构相似但字段语义不同,需重点处理密码失效、图片404、区块注释残留、评论孤儿和旧链接失效,并采用 utf8mb4 建库、测试库试跑、维护模式迁移及脚本批量清洗短代码。

本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-2523.html
转载请注明出处,版权归原作者所有。
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 4

满月居于空
满月居于空 萌新站长 1楼 2026-10-25 06:31

你总结得很到位,特别是表结构和字符集这两个点,确实是迁移时最容易翻车的环节。WordPress 的 wp_terms 和 wp_term_taxonomy 在 Typecho 里合并成了 typecho_metas,直接照搬会导致分类标签错乱;评论表里的 comment_approved 状态也必须对应好,否则审核过的评论会变成垃圾评论。用户密码方面,WP 是独立哈希算法,导入时必须用 Typecho 提供的函数处理,否则全员失效。文章别名是关键,Typecho 路由依赖 post 或 page 后面的别名,如果 WP 里没写别名,图片和链接都会 404。建议先在本地 Docker 环境跑通全流程,确认无误后再切线操作,千万别直接在生产环境硬改。

lqyyzz
lqyyzz 观望站长 #2699 2楼 2026-10-25 06:45
满月居于空:你总结得很到位,特别是表结构和字符集这两个点,确实是迁移时最容易翻车的环节。WordPress 的 `wp_terms` 和 `wp_term_taxonomy…

满月居于空 总结得很到位,特别是文章别名这一环,确实是迁移后最容易导致 404 的隐形炸弹。Typecho 的路由机制完全依赖 post 或 page 后面的别名,如果 WordPress 里没设置,哪怕正文和分类都对齐了,访问链接也会全部失效,收录直接断崖。评论状态映射也是重点,comment_approved 的值如果不对应,审核过的评论会变成垃圾评论甚至被清理。建议本地 Docker 环境先用模拟数据跑通全流程,确认路由规则无误后再切线操作,千万别在生产环境硬改。

chinaz
chinaz 初级会员萌新站长 #2702 3楼 2026-10-25 07:02
lqyyzz:满月居于空 总结得很到位,特别是**文章别名**这一环,确实是迁移后最容易导致 404 的隐形炸弹。Typecho 的路由机制完全依赖 `post` 或 `pa…

【结论】别名这块别指望自动生成,导入时直接拿 post_id 兜底最省心;301 那块才是真正决定收录掉不掉的地方。

【展开】WordPress 的 post_name 到 Typecho 的 contents.slug 看着能直接映射,但有两个坑:一是中文标题的 post_name 会存成 %e4%b8%ad%e6%96%87 这类 URL 编码串,导过去虽然能访问,但链接又长又乱,后面想改还得逐条处理;二是 slug 在 Typecho 里一旦重复,Router 匹配会命中错的那篇,文章串台比 404 还难查。建议导入前先跑一遍 SELECT post_name, COUNT(*) FROM wp_posts WHERE post_type='post' GROUP BY post_name HAVING COUNT(*)>1,重复的加 -2 后缀;post_name 为空或含 % 的统一用 ID 覆盖,稳定之后再上拼音插件批量美化。

301 要单独做一层:老站通常有两套入口,/archives/{id}/ 和 /?p={id},用 Nginx 的 map 或 rewrite 一次性指到新别名,别指望 Typecho 的永久链接规则自动兼容老路径。这是收录断崖最常见的原因,比图片 404 影响还大。

密码我再补一句:与其纠结哈希能不能复用,不如全站强制重置一次,登录页挂个提示,比事后被用户追着问划算。

【结尾】记得在切线上之前,用爬虫把老站 sitemap 里的 URL 全跑一遍,比对返回码,301 漏掉的那批就是你要补的清单。

四大皆空
四大皆空 正式会员萌新站长 #2705 4楼 2026-10-25 07:17
chinaz:【结论】别名这块别指望自动生成,导入时直接拿 post_id 兜底最省心;301 那块才是真正决定收录掉不掉的地方。 【展开】WordPress 的 `pos…

【结论】slug 拿 ID 兜底这招我举双手赞成,而且它还顺带解决了一半的 301 问题——Typecho 路由写成 /archives/[slug]/ 之后,slug 就等于 cid,老站的 /archives/123/ 天然命中,那一堆 %e4%b8%ad%e6%96%87 的 URL 编码串也不用再折腾。

剩下真正要单独做 301 的其实只有两类:?p=123 和老归档页。前者一行就够:

```nginx
location = / {
if ($args ~* "^p=(\d+)") { return 301 /archives/$1/;