Wordpress 博客数据搬迁记录

月中的 12 号是使用 Wordpress 第六个年头的日子,其实很感谢 Wordpress 这个开源 CMS Blog 系统,它让我学会了搭建一个网站,而不是自己去搞个轮子,我主张的是如何能把这件事先做出来,比如说我要做一个网站,我是不会去拿《PHP 编程技术》、《JavaScript权威指南》、《精通 CSS》这些来慢慢学,而是直接去想我要在最短时间内做出这个网站,自然顺藤摸瓜到开源软件了,这是一种学习路径,当然了这样一来技术底子就没那么强,不过对于快速学习来说,这是一种很好的方式,对于我而言。

今天把老博客的数据整理了下,发现这么多年来,我还真没写出个什么出来,于是就筛选了几篇文章搬迁到新的博客来,毕竟还是有念想,算是六年来的一个见证。

迁移准备:

  • 首先,安装 hexo-migrator-wordpress 插件,Hexo博客根目录执行:
    $ npm install hexo-migrator-wordpress --save
  • 然后,在 WordPress 仪表盘中导出数据(“Tools” → “Export” → “WordPress”)
    最终导出为一个 XML 文件,详情参考WP支持页面

执行迁移

  • 插件安装完成,就执行下列命令来迁移所有文章。source 可以是 WordPress 导出的文件路径或网址。
    $ hexo migrate wordpress <source>

执行迁移过程中遇到的问题

  • 1、插件to-markdown报错TypeError: Cannot read property '1' of null,日志如下:
    [error] TypeError: Cannot read property '1' of null
    TypeError: Cannot read property '1' of null
    at ELEMENTS.replacement (\node.js\hexo\node_modules\to-markdown\src\to-markdown.js:71:70)
    at \node.js\hexo\node_modules\to-markdown\src\to-markdown.js:96:41
    at String.replace (native)
    at replaceEls (\node.js\hexo\node_modules\to-markdown\src\to-markdown.js:95:23)
    at toMarkdown (\node.js\hexo\node_modules\to-markdown\src\to-markdown.js:78:16)
    at \node.js\hexo\index.js:59:54
    at \node.js\hexo\node_modules\async\lib\async.js:111:13
    at Array.forEach (native)
    at _each (\node.js\hexo\node_modules\async\lib\async.js:32:24)
    at Object.async.each (\node.js\hexo\node_modules\async\lib\async.js:110:9)
    I have no idea about how to deal with it.

来自 SunnyBingoMe 的解决办法:

// hexo\node_modules\to-markdown\src\to-markdown.js: line 70
{
patterns: 'img',
type: 'void',
replacement: function(str, attrs, innerHTML) {
var src = attrs.match(attrRegExp('src')),
alt = attrs.match(attrRegExp('alt')),
title = attrs.match(attrRegExp('title'));
// after line 70. hot-fix: add this if-statement
if (src == null){
src = "_img_src_error_";
}
return '![' + (alt && alt[1] ? alt[1] : '') + ']' + '(' + src[1] + (title && title[1] ? ' "' + title[1] + '"' : '') + ')';
}
}

2、最终生成的MD文件名乱码,大概是这样的:

e8-af-ad-e8-a8-80-e7-89-b9-e6-80-a7-e8-85-e8-a6-81-e5-ad-a6-e4-b9-a0-e7-9a-84.md
e8-bd-af-e8-bf-9e-e6-8e-a5-e5-92-8c-e7-a1-ac-e8-bf-9e-e6-8e-a5.md
e8-bf-bd-e8-b8-aaquery-too-complex-not-enough-stack-e9-94-99-e8-af-af.md

文件名生成的URL和原Wordpress中的编码不一致导致,如果已经执行了迁移,那么可以用下面的 Python 脚本处理,然后从文件内容的title部分提取出文件名,代码如下:

import os,sys
def getTitle(firstLine):
strs = ':'.join(firstLine.split(':')[1:])
strs = strs.replace("'", '')
strs = strs.strip()
title = '-'.join(strs.split(' '))
return title
if __name__ == "__main__":
dirName = sys.argv[1]
for root,dirs,fileNames in os.walk(dirName):
for fileName in fileNames:
print fileName
print root
fileName = os.path.join(root, fileName)
f = open(fileName)
firstLine = f.readline()
title = getTitle(firstLine)
print title
content = firstLine + f.read()
f.close()
newname = title + '.md'
print newname
os.rename(fileName, os.path.join(root,newname))

如果还没执行迁移,可以到node_modules/hexo-migrator-wordpress/index.js这个文件里找到如下语句:

if (!title && !slug) return next();
if (type !== 'post' && type !== 'page') return next();
if (typeof content !== 'string') content = '';

然后在这几句语句前加上一个判断:if (slug) slug = decodeURI(slug);
如果有其他问题,到插件开发者的 github 提问:issues

坚持原创技术分享,您的支持将鼓励我继续创作!