从wordpress迁移到hexo填坑

前记

用了好久的wordpress,说起来上次更新还是三年前。今天本想整理总结下最近的学习,却总也打不开wp-admin后台了,看了下是vps的php进程有报错 :( 想了想wordpress这套框架虽然很好,然而好多功能对我来说并不是必要的,于是动了心思从wordpress 迁移到静态化的博客框架 hexo。当然另外一个好处就是可以用 Markdown 语法写日志了 :)

迁移过程遇到一些坑,这里做下备忘…

开始迁移

安装hexo

网上安装hexo的文章已经很多了,这里不再冗述,大概流程就是

  • 1、安装nodejs
  • 2、配置环境变量
  • 3、npm install -g hexo-cli
  • 4、初始化站点 hexo init blog_dir
  • 5、修改_config.yml

导出wordpress文章

因为无法打开博客的后台管理,只能在本地临时又搭建了一套wordpress 环境,这里再次坚定了迁移的决心(弄php+mysql+nginx这一套只用来写博客,太麻烦了)
访问后台 – 工具 – 导出,下载导出的文件,你将得到一个 .XML 文件,这个XML文件包含全部文章、页面、评论、自定义栏目、分类目录和标签。

导入文章到hexo

首先安装 hexo-migrator-wordpress 插件:

安装
1
2
cd blog_dir
npm install hexo-migrator-wordpress --save

插件安装完成后,执行下列命令来迁移所有文章。source 可以是 WordPress 导出的文件路径或网址。

导入
1
hexo migrate wordpress <source>

这个插件并不完美,好多文章和页面生成的md文件都很杂乱,而且页面排版也有很多问题,所以后来我又写了一个py脚本来处理历史数据

使用主题 next

解决标签和分类Not foud问题

在配置文件中增加了tag 和categories ,但是在首页点开却得到了一个not found 的错误。官方的issues 有朋友提到并提供了解决方案(参考tag和categories无内容)。

首先在next的配置文件_config.yml 中打开如下配置

1
2
3
4
5
6
7
menu:
home: /
categories: /categories
#about: /about
archives: /archives
tags: /tags
#commonweal: /404.html

然后执行 hexo new page tags,在生成的文件/source/tags/index.md,增加type

1
2
3
4
5
---
title: 标签
date: 2018-10-21 10:35:32
type: "tags"
---

分类页面也类似执行 hexo new page categories,在生成的文件 source/categories/index.md,修改如下

1
2
3
4
5
---
title: 分类
type: "categories"
date: 2018-10-21 10:35:50
---

使用python 脚本解决文章错乱问题

使用 hexo-migrator-wordpress 插件导入的文章有很多的问题,错行,样式杂乱,内容错误。

最无法忍受的是之前文章中因为有代码高亮,<pre><code> 标签内的文字导过来全错了,多了很多\ 以及其他转义符号,所以自己写了一个脚本来处理这个问题,代码可以参考如下:

导出wordpress文章
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python3
# author: http://wangheng.org
# fileName: import_wordpress_content.py
# date: 2018-10-21

import pymysql
import re

HOST = "your wordpress db host"
DB = "your wordpress db"
USER = "your db user"
PASSWORD = "your db passwd"
EXP_PATH = "wp_exp" # path to export .md files
conn = pymysql.connect(
host=HOST, database=DB, user=USER, password=PASSWORD, charset='utf8mb4')


def getData(query):
cur = conn.cursor()
cur.execute(query)
data = cur.fetchall()
return data


def getPostTags(post_id, tag_type):
tags = getData('''
SELECT wpt.`name`, wpt.slug, wptt.taxonomy
FROM
wp_terms wpt
LEFT JOIN wp_term_relationships wptr ON wpt.term_id = wptr.term_taxonomy_id
LEFT JOIN wp_term_taxonomy wptt ON wptt.term_taxonomy_id = wptr.term_taxonomy_id
WHERE
wptr.object_id = %d
and wptt.taxonomy="%s"
''' % (post_id, tag_type))
res = ""
for tag in tags:
res += " - %s\n" % tag[0]
return res


def main():
posts = getData(
"SELECT post_name,post_content,post_date,post_title,ID FROM `wp_posts` where post_type='post' and post_status='publish' "
)
for post in posts:
content = post[1]
content = content.replace('http://wangheng.org/wp-content/uploads',
'uploads')
content = content.replace('>\n<', '><')
content = content.replace('>\r<', '><')
content = content.replace('>\r\n<', '><')
blog = '''
---
title: %s
tags:
%s
url: %s.html
id: %d
categories:
%s
date: %s
---

<content>
%s
</content>
''' % (post[3], getPostTags(post[4], "post_tag"), post[0], post[4],
getPostTags(post[4], "category"), post[2], content)
print(blog)
file = open("wp_exp/%s.md" % post[0], 'wb')
file.write(blog.encode("utf-8"))
file.flush()


if __name__ == '__main__':
main()
解决非常多空行的问题

这里还遇到了个非常奇葩的问题,如果写到md 文件的两个html 标签不在同一行,那么md 再生成的文章会多出很多的 <br> 换行符。。。

参考代码
1
2
3
content = content.replace('>\n<', '><')
content = content.replace('>\r<', '><')
content = content.replace('>\r\n<', '><')
解决迁移后图片以及附件问题

迁移后图片和附件的地址无法再使用wordpress 目录了,因此需要将文章内的链接修改下

1
content = content.replace('http://wangheng.org/wp-content/uploads', 'uploads')

然后将vps 中的wp-content 文件夹copy到hexo目录,设置配置文件

1
2
#指定目录以及子目录文件跳过渲染
skip_render: uploads/**

代码高亮

使用脚本导出的.md 文件相当于把之前wordpress 中的文章富文本直接copy 到了md 文件中,因此文章结构几乎没怎么变化,也利于博客站的SEO

另外保持了原来代码高亮的结构,只要在主题的配置文件设置一下开启代码高亮,效果还可以~

1
2
3
4
# Code Highlight theme
# Available values: normal | night | night eighties | night blue | night bright
# https://github.com/chriskempson/tomorrow-theme
highlight_theme: night eighties

其他

todo 暂时整理这些,其他待补充…