由于使用了 WP-Editor.md 插件,由 WordPress 完全导入 Typecho 很不容易。故开篇文章纪念下遇到的坑。
Markdown 导出问题
Typecho 官方推荐的插件是 WordpressToTypecho,用这个插件会直接导出 WordPress 的 wp_posts
表里 post_content
字段。这样会发现存的全都是 HTML,不方便编辑。
仔细研究一番 WP 的数据库结构,会发现有个叫做 post_content_filtered
的字段。虽然官方对这个字段没有解释,但是 WP-Editor.md 插件在这个字段里存的就是 Markdown 源码。但是,对于在 WP-Editor.md 插件启用之前写的文章,这个字段是空的,对于这些文章我们应该只能导出 HTML。
尝试改写插件,MD 源码确实导出了,但是在编辑器中 Typecho 却认为这是 HTML。于是又研究了一番 Typecho 的数据库,发现其实 Markdown 的文章源码内容之前都加了一个注释:<!--markdown-->
,代表这是一段 markdown。所以我们导出的 Markdown 也要加上。
所以我们可以改写插件的 Action.php
中导出文章的部分(181 行):
'text' => $row['post_content_filtered'] ? '<!--markdown-->'.$row['post_content_filtered']:$row['post_content'],
注意:有一个坑点,有些 WP 数据库里的自动存档时间字段是 0000-00-00 00:00:00
,插件里使用了格式化为 Unix 时间戳的一个 php 函数,这样的时间会被格式化成一个负数,而 Typecho 数据库里时间戳字段存的都是 UNSIGN
类型,所以会导致导出的时候查询语句错误,Typecho 显示 Database Query Error
。虽然实际上并不影响导入,但还是建议先删除 wp_posts
里所有时间为 0000-00-00 00:00:00
的记录。
(顺便吐槽:WordPress 自动保存和文章历史的机制实在太恶心,大量占用数据库,关都关不掉,还每个版本都保存全文……)
字符转义问题
导出 Markdown 会发现:可能 WP-Editor 为了兼容的方便,很多字符被转义了……
目测 WP-Editor.md 插件会转义的字符是 <
>
'
"
&
(其实就是 htmlspecialchars()
转义的吧)。我们可以用 SQL 的 replace 函数来批量替换。
在 phpMyAdmin 之类的控制台里,可以运行以下 SQL 语句:
update `te_contents` set text=replace(text,'<','<')
update `te_contents` set text=replace(text,'>','>')
update `te_contents` set text=replace(text,"'","'")
update `te_contents` set text=replace(text,'"','"')
update `te_contents` set text=replace(text,'&','&')
运行之后就会发现问题都完美解决了。
WordPress,再见啦。