博客从迁移Wordpress到Hugo
静态博客越来越流行了,而且用Markdown写文章也便于管理维护,搞得我也蠢蠢欲动。在工具上,我从Jekyll,Hexo和Hugo中选了Hugo,没什么特别理由,无非就是Ruby,Node和Go中选了Go罢了。不过在转博客过程中,确实遇到不少坑,挺折腾的。这里把过程整理下,方便将来其他朋友们参考。
博客内容导出
首先要强烈推荐一个工具WordPress to Hugo Exporter,省掉了我很多的工作量,虽然还是不那么完美。它的作用就是将WordPress里的文章导出成Hugo可以识别的Markdown。使用起来也很简单,方法如下:
在WordPress的插件目录
wp-content/plugins/
下,直接克隆”WordPress to Hugo Exporter”的源码$ git clone https://github.com/SchumacherFM/wordpress-to-hugo-exporter.git
打开WordPress管理员控制台,启用该插件
打开菜单”工具”,点击”Export to Hugo”
浏览器会自动下载一个
hugo-export.zip
文件解开文件,主要有以下几个部分:
- config.yaml: Hugo的配置文件,这个我们会重写
- posts: 该目录下有所有的博客文章,都是MD文件,文件名带日期,所以可以按日期排序
- wp-content: 该目录下主要就是uploads目录,里面放着所有之前上传过的媒体文件。WordPress是按年和月分开存放的。
- 如果你还创建了其他页面,则有其他页面名称的目录,里面也是放着MD文件
查看任一MD文件,你可以看到开头的YAML部分 ,文章标题、作者、创建时间、URL地址、分类、标签等信息都有。另外还有一个摘要信息,但是一般Hugo主题不识别”excerpt”摘要,你可以把它改为”description”,这样,该部分就会变成网站页面header上的”meta descrpition”的内容。
至此导出工作完成。另外,你也可以到插件目录wp-content/plugins/wordpress-to-hugo-exporter
下直接执行命令:
$ php hugo-export-cli.php
该命令也会在本地生成一个hugo-export.zip
文件,同WordPress管理员控制台生成的一样。
创建新Hugo站点
首先要安装Hugo,我的环境是Ubuntu16.04,虽然可以用apt来装,但是版本太老,我选择从deb包装
先从https://github.com/gohugoio/hugo/releases下载deb包,当前最新是0.55.6
$ wget https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.deb
安装deb包
$ dpkg -i hugo_0.55.6_Linux-64bit.deb
安装成功后,你可以执行
hugo version
命令来查看Hugo版本创建新站点,假设新站点目录在
/home/bjhee/site
下$ hugo new site /home/bjhee/site
将在之前
hugo-export.zip
文件解压出来的文件和目录,除config.yaml
外都放到/home/bjhee/site/content
目录下
选择主题
这是有选择困难症的我最郁闷的时候,Hugo提供了非常丰富的主题库,你可以到https://themes.gohugo.io/下选。但是我居然没一个挑中的。主要是,我希望有我WordPress博客的功能,如搜索、标签、分类、归档、RSS订阅等。同时我也懒得自己改代码去支持。挑到最后,我选择了一个非官方库里的主题,是Github上一个大牛飞雪无情修改过的”maupassant”主题,而他是从另一个大牛JokerQyou这里Fork的分支。
安装主题的方法也简单,在刚才新站点目录/home/bjhee/site
下,新建一个themes
目录。然后在该目录下,克隆主题源码:
$ mkdir /home/bjhee/site/themes
$ cd /home/bjhee/site/themes
$ git clone https://github.com/rujews/maupassant-hugo.git
接下来,配置站点,打开/home/bjhee/site/config.toml
文件,做如下修改
baseURL = <站点地址>
languageCode = "zh-cn"
title = <站点标题>
hasCJKLanguage = true # 中日韩语言支持
theme = "maupassant-hugo" # 主题名称,与themes目录下名称一致
enableRobotsTXT = true # 爬虫支持
PaginatePath = "page" # 分页
summaryLength = 140 # 摘要显示字数
[author]
name = <作者名>
homepage = <站点地址>
[params]
subtitle = <站点副标题>
description = <站点描述> # 在页面meta属性里
keywords = <站点关键字> # 在页面meta属性里
toc = true # 支持文章大纲
[[params.links]] # 友情链接
name = <链接名称>
url = <链接地址>
title = <链接标题>
[[menu.main]] # 菜单栏,这里是归档页
identifier = "archives"
name = "存档"
url = "/archives/"
weight = 3
[[menu.main]] # 菜单栏,这里是关于页
identifier = "about"
name = "关于"
url = "/about/"
weight = 4
以上尖括号部分,记得改为你站点的信息。
另外,在生成网站前,还要记得先创建归档页和关于页:
在
content
目录下,创建归档页archives.md
,内容如下:--- title: "归档" type: "archives" author: <作者名> ---
在
content
下,创建归档页about.md
,内容如下:--- title: "关于" author: <作者名> type: "about" --- <此处写上自我介绍>
这样,准备工作就完成了。
生成网站
Hugo自带了Web服务器,你可以用下面的命令启动:
$ cd /home/bjhee/site/
$ hugo server
启动时会编译所有的MD文件,速度很快。完成后,你可以从http://localhost:1313
来访问你的新站点
如果你是从别的机器上访问,你可以用下面的命令启动(假设你的访问域名是www.hugo.com
):
$ hugo server -D --bind 0.0.0.0 --baseURL "http://www.hugo.com/"
另外,Hugo的Web Server支持热修改,也就是你可以随时修改MD文件,一保存就会重新编译加载,所以写文章很方便。
修改文章内容
为什么有这一步呢,因为本人的博客里有很多代码示例,用了代码高亮插件,代码都是通过<code>
标签来标记的。而”WordPress to Hugo Exporter”转换成Markdown后,像<code>
、<pre>
还有列表标签如<li>
这种,都是没法转换的。可是这些标签在Hugo里留着,文章内容就乱了。再加上本人有点手贱,之前写WordPress时,喜欢加HTML,文章看上去布局很好,现在惨了,好多标签没转换过来,只好手动改。
当然,对于技术人员来说,也不是事儿,用编辑器像VSCode这样的,写正则表达式做批量修改。就是要仔细,另外改完后要一个一个测一遍。我虽然就100篇不到的文章,也搞得累趴下。
生成静态页面
刚才网站实验成功后,该改的MD文章改完,你就可以用Hugo生成静态页面,这才是Hugo真正的价值所在,因为你可以把静态文件放在任一Web Server上,比如Nginx或Apache就可以工作了。具体命令如下:
$ cd /home/bjhee/site/
$ hugo
编译完后,所有静态页面和网站资源都会保存在/home/bjhee/site/public
目录下。你只要将该目录作为Nginx或Apache的Root目录,就可以工作了,简单吧。
修改主题
最后说一下,我对主题的修改。”maupassant”主题基本上很不错了,不过我还是做了些修改,并且把修改放在了我Fork后的我的Github仓库上。主要的修改如下
“maupassant”使用的搜索是Google,对大部分国人来说,访问不方便,我改为了百度搜索。主要是拼接了百度的站点搜索语法
<关键字> site:<站点域名>
主题里每篇文章底部都有”See Also”部分列出相关文章,这个功能我加了个
config.toml
的开关可以关闭,配置如下[params] related = false # true 为开启
国内站点都要求备案,我加了一个配置,可以填备案号,配置如下
[params] registerInfo = "沪ICP备xxxxxxx号"
可以设置右边栏最近文章链接的个数,默认为10,并加上文章日期
[params] recentPostNumber = 5
添加百度统计,需要在百度统计的嵌入脚本里,找到”hm.src”地址,并把后面的那串ID配上
[params] baiduAnalysisId = "0f4fc19c9df1256edcd8e4f84e045f78"