WordPress迁移Jekyll没那么简单

2016/11/15

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接

有人说将博客从WordPress迁移到Github非常简单,并且不再需要为VPS买单了,听起来非常美好,然后我也心动了,于是就这样上路了。等我走完这趟路,发现一路上遇到N多坑,有些坑只能绕过去,还有些坑绕都绕不过去,非常耗精力,前后耗时将近3个星期。古人云:纸上得来终觉浅,绝知此事要躬行。也有小马过河的寓言故事,别人说的事情,到你身上真不是那么回事了,折腾啊折腾,不停折腾。所以各位若想要从WordPress迁移到Github Jekyll的朋友,一定要想清楚了,准备好这么多精力来玩把。当然,好处也是有的,不用为VPS买单了,也可以学到不少新玩意。

博客为何要从WordPress迁移到Jekyll

以前一直在用WordPress,WordPress是一个动态网站,需要服务器来运行,所以买了VPS服务,每个月都需要交75块,但实际上VPS也并没有给我带来什么很大的好处,刚买的时候,想着玩玩VPS,搭点Web服务上去玩玩,尝试各种新技术,但实际上这么几年下来并没有在上面玩什么新技术,只是在上面放了两个网站而已,钱倒花了不少。

另外,大家都知道在WordPress上写博客,最麻烦的其实是调显示的样式,我喜欢在本地写博客,写好内容之后我还需要转换成网页显示的内容,然后再在WordPress的后台新建文章,再将内容传上去,还要调整上传图片,再插入图片,这些事情是非常麻烦的。

工作中我们都已远离Office Word了,转向使用markdown写文档,然后分享给同事,只需要分享一个链接就够了,同事每次都能看到最新的文档,再也不用担心文档同步的问题了。 若使用Word文档,我们协作的同事接收了老文档后,他后续会一直看这个老文档,除非我们发新文档给他,这样文档同步很麻烦,如果很多同事一起看的文档更是如此。

所以我比较喜欢markdown文档,如果能用这个写博客那就太赞了。同事跟我说,现在可以在Github上托管网站,可以用makdown写个人博客,还不用花钱,非常划算,并且从WordPress迁移到 Github也非常容易,也就是几个小时的事情。听起来非常有诱惑力,于是在网上找了一下GitHub托管网站的原理,以及如何迁移的一些资料,感觉好像也不难,资料也很全。于是就开始走上了这条坎坷的迁移之路。

选择Jekyll还是Hexo

GitHub可以托管个人博客,项目网站,还可以用域名映射,将个人域名映射到Github给你分配的域名,这样可以用自己的域名访问,不仅个人博客可以使用自定义域名,项目也可以使用自定义域名。但是GitHub只支持托管静态网站,也就是说你不支持用php,ruby,python写的网站,不过GitHub还支持Jekyll这种静态博客网站生成器,你只需按照Jekyll的语法组织网站,然后将代码以及文章提交到GitHub,GitHub就会利用Jekyll为这个网站生成静态网站。

如果做开源项目,可以给这个项目建网站,不用另外找VPS托管项目网站

目前的静态博客生成器还有hexo,Jekyll基于ruby实现,在Windows上搭建Ruby环境比较麻烦,而Hexo基于NodeJs,搭建NodeJS环境比较简单,所以对于大部分人来说使用hexo更适合。

我使用jekyll的原因是我在听说hexo的时候玩Jekyll有一段时间了,对它的语法都比较熟悉,如果再迁移到Hexo,又需要折腾,比较麻烦。Hexo 除了开发环境 比jekyll友好一些外,其它并没有更多优势,而我已经搭建好了开发环境。另外我已经选择好了Jekyll的主题,并且结合了另一个主题,修改了很多东西,好不容易才把网站主体弄好,再迁移到Hexo太耗精力了。所以我就在Jekyll上一条路走到黑。选择Jekyll的另一个原因是Github对Jekyll有原生的支持,而Hexo还需要把生成好的静态网站的内容上传到GitHub上,如果修改全局配置,估计上传都要上传很多东西。

迁移至Jekyll遇到的那些坑

  1. 博客内容显示问题

    从WordPress将博客内容迁移到Jekyll后,在预览时发现存在很多问题,尤其是代码块,原因是官方推荐的迁移工具(wordpress-to-jekyll-exporter)在导出博客内容时,是将显示内容直接导出来,新的Jekyll网站的样式并不支持这些代码块内容的显示。

    因为markdown其实是支持html代码的,所以我的解决方案是将原来的博客内容从数据库里导出来,每篇博客存成一个以博客标题为名的文件,然后将这些文件和先前导出来的文件进行合并。

    因为已经有60多篇博客,如果单个处理还是很费工夫,所以就写了python脚本来做合并,当时使用python 2写的脚本,然后也遇到了一堆编码问题,折腾了不少时间。

    因为要利用这个工具导出来的博客的元数据,比如评论数,查看数,分类数据,所以做这种合并

    这样折腾完了还不算,然后在预览时发现下面的内容经常出问题,必须删除下面的标签,才能让包含在这些标签里的代码显示正确,在处理这块时还是使用sublime text打开这些文件,挨个处理的,可想而知,做这个事情多耗精力。

    1
    2
    3
    
    <ul><li></li></ul>
    
    

    这样折腾了还没完,还得处理摘要问题,在Jekyll里可以设置怎么截取文章摘要的, 我设置了”\n\n”,但是在预览时发现有些文章的摘要显示很不理想,所以还是得挨个处理文章,合理显示摘要。

    处理这个博客内容显示问题就花了非常多时间,真不是个轻松的活,所以那些想从WordPress迁移到Jekyll的朋友需要想清楚,如果已经有大量博客了,需要花不少时间来迁移的。

    下面附上迁移博客用到的脚本:

    从WordPress导出博客内容的Shell脚本:

    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
    
    #!/bin/bash
    
    cat title.txt | while read line
    
    do
    
      echo "gen content for $line"
    
      sql="
    
           SET character_set_results  = utf8 ;  
    
           SET character_set_client = utf8 ;
    
           SET character_set_connection =utf8 ;
    
           select post_content from wp_posts where post_status = 'publish'and post_title ='$line' "
    
      echo $sql |  mysql -uuser -ppassword blog | sed -e 's/\r\\n/\n/g' -e '1d' -e 's/<pre lang="\([a-z]*\)
    
    "[^\n]*/```\1/g' -e 's/<\/pre>/```/g' > "$line.md"
    
    done
    
    
    
    

    其中title.txt 是用下面的sql脚本和Shell脚本生成的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      SET character_set_results  = utf8 ;  
    
      SET character_set_client = utf8 ;
    
      SET character_set_connection =utf8 ;
    
      select post_content from wp_posts where post_status = 'publish'
    
    
    1
    2
    3
    4
    5
    
     mysql -uuser -ppassword blog < test.sql > title.txt
    
    
    
    

    将博客文件内容合并的python脚本: 合并脚本

  2. 不能分页显示某个分类下所有文章的摘要

    以前用WordPress写博客时,会建多个分类,然后在顶端菜单栏上建立多个分类导航链接,用户可以直接看某个分类下的所有文章,并且分页显示所有文章的摘要,我觉得这对于用户来说比较友好,可以看某类文章,但是迁移到Jekyll后,发现这个功能不能实现,只能折衷处理,所以如果要迁移的朋友请考虑清楚。

    不能显示的原因是因为Jekyll是一个静态网站生成器,默认的分页显示其实是Jekyll生成多个分页目录来实现的,如果实现分类的分页,Jekyll需要为每个分类生成分页目录,会十分麻烦,如果有多个分类更加麻烦,本来想着写Jekyll插件来处理这个事情,后来发现Github上是不会加载第3方Jekyll插件的,所以就放弃了。

    最终还是妥协了,采用折衷的方案,在Jekyll模版代码里获取所有文章的标题,分类,时间,Tag等信息,然后在这个页面里用比较友好的方式呈现给用户,所以我直接用主题的代码组织成博客纪事形式了。

    Jekyll的页面不可以获取所有文章的摘要

  3. 不能显示文章查看数

    WordPress是一个动态网站,有数据库支持,可以统计每篇文章的查看数,对于博主来说,查看文章的查看数是一件比较有成就感的事情,但是Jekyll是一个静态网站,就不好处理这个事情了,必须依赖第3方存储服务才能实现文章统计计数。

    迁移时,我尝试Google可以用于Jekyll统计文章查看数的第3方服务,但是没找到。后来了解到Hexo的Next主题可以统计文章查看数,于是就查看Next主题代码,才发现原来它用了LeanCloud的云存储服务,于是尝试着把Next的统计代码分离出来,用在Jekyll上,就这样终于支持文章查看数的统计了。

    如果想要让Jekyll支持文章查看数的统计,请看《如何让Jekyll支持文章查看数的统计》

  4. 评论系统选择友言,多说,还是Disqus?

    以前用WordPress的时候,一直在用友言做评论系统,因为它是社交化的评论系统,可以在社交平台进行评论。后来,文章列表的评论数的数据一直显示不正确,找友言的客服咨询,才发现友言基本上已经停止运营了,在将博客迁移至Jekyll之前,一直也没有伤心处理这个问题。

    迁移到Jekyll之后还是得选择一个靠谱的评论系统,因为友言已经基本停止了运营,所以只能选择它的同类产品,多说还是Disqus? 多说据说经常抽风,也没有人维护,但是Disqus的问题更严重,它被墙了,所以用户无法评论,有些博主通过代理的方式来解决这个问题,并且分成浏览模式和评论模式,评论模式基本不可用,只能在浏览模式查看评论,所以也不好弄,只有翻墙的用户可以评论。

    对于我来说,这种代理搭起来也比较麻烦,所以选择了多说,也体验了一下,至少现在评论及查看评论还是没有问题的。

    选择多说做评论系统后,又遇到一个棘手的问题,想将以前在友言的评论全部导出来, 才发现友言备份评论时一直500,都无法迁移,后悔没有早些到处评论了,现在评论数据全丢了,只能对以前那些评论过的朋友们说声对不起了,后续再想办法将友言的评论数据导出来,估计得自己写脚本在页面扒数据才能做到了,也是一个比较费工夫的事情。

    最近终于将友言的评论导入了多说,请看《如何将友言的评论导入多说》

  5. sublime text插件的编写

    为了更方便地写博客,还有一个问题需要解决,就是需要实现一个Sublime Text的插件,用于生成博客模版。

    因为博客内容里有一些元数据,比如标题,时间,文章id,分类,永久链接,如果每写一篇博客都要填写这些东西,那会相当麻烦,并且文章的id每次都需要计算的,如果手动算每次应该用什么id,估计要吐血了,还有时间信息,填写也会相当麻烦,并且每次写文章时,保存文章的文件名的格式也是有规范的,稍有不慎也会填错,所以没一个插件来辅助写博客真真是要崩溃的。

    所以,又花了一些工夫来学习写sublime text的插件,不得不佩服sublime text的扩展能力,写插件还是比较简单的。

    我用的是sublime text3,它带的python版本是3.0. 只要编写一个继承自WindowCommand的类,覆盖run方法即可。代码可以参考我在GitHub上的Gist

迁移心得

从WordPress迁移到Jekyll,真的是一件很折腾的事情。

以后听到别人说很easy的事情,还是当心一点把,别人很easy的事情,到你这可真不是那么回事,毕竟每个人情况不一样。

后续做某件事情前,还是要研究一下可能会遇到哪些问题,评估风险才行动,比如这次迁移应该要事先料到博客内容显示问题和评论计数问题。

python2在处理中文真是一个蛋疼的问题,各种坑,包括文件名,读写文件内容,控台输出,并且在Sublime里写python脚本并运行,会发现输出中文到控制台的脚本没法输出,因为sublime text是将控制台的输出放到一个文件里,而往文件里写中文内容,是需要做编码控制的。所以用Sublime text写python脚本并不是一个好主意,还是选择专门的IDE(比如PyCharm)把。

¥打赏5毛

取消

感谢您的支持,我会继续努力的!

扫码支持
赏个5毛,支持我把

打开支付宝扫一扫,即可进行扫码打赏哦

本篇目录