由于使用了 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,'&lt;','<')
update `te_contents` set text=replace(text,'&gt;','>')
update `te_contents` set text=replace(text,"&#039;","'")
update `te_contents` set text=replace(text,'&quot;','"')
update `te_contents` set text=replace(text,'&amp;','&')

运行之后就会发现问题都完美解决了。

WordPress,再见啦。