静态博客越来越流行了,而且用Markdown写文章也便于管理维护,搞得我也蠢蠢欲动。在工具上,我从Jekyll,Hexo和Hugo中选了Hugo,没什么特别理由,无非就是Ruby,Node和Go中选了Go罢了。不过在转博客过程中,确实遇到不少坑,挺折腾的。这里把过程整理下,方便将来其他朋友们参考。

博客内容导出

首先要强烈推荐一个工具WordPress to Hugo Exporter,省掉了我很多的工作量,虽然还是不那么完美。它的作用就是将WordPress里的文章导出成Hugo可以识别的Markdown。使用起来也很简单,方法如下:

  1. 在WordPress的插件目录wp-content/plugins/下,直接克隆”WordPress to Hugo Exporter”的源码

    $ git clone https://github.com/SchumacherFM/wordpress-to-hugo-exporter.git
    
  2. 打开WordPress管理员控制台,启用该插件 Enable Plugin

  3. 打开菜单”工具”,点击”Export to Hugo” Export to Hugo

  4. 浏览器会自动下载一个hugo-export.zip文件

  5. 解开文件,主要有以下几个部分:

    • config.yaml: Hugo的配置文件,这个我们会重写
    • posts: 该目录下有所有的博客文章,都是MD文件,文件名带日期,所以可以按日期排序
    • wp-content: 该目录下主要就是uploads目录,里面放着所有之前上传过的媒体文件。WordPress是按年和月分开存放的。
    • 如果你还创建了其他页面,则有其他页面名称的目录,里面也是放着MD文件
  6. 查看任一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包装

  1. 先从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
    
  2. 安装deb包

    $ dpkg -i hugo_0.55.6_Linux-64bit.deb
    

    安装成功后,你可以执行hugo version命令来查看Hugo版本

  3. 创建新站点,假设新站点目录在/home/bjhee/site

    $ hugo new site /home/bjhee/site
    
  4. 将在之前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"