WordPress 迁移至 Hexo 全记录

本文不含 hexo 主题、配置教程,请注意。

腾讯云的一通电话,让我勤劳了起来,因为他们跟我说:您好,发现您的这个域名不在腾讯云上,如果不改解析的话会掉备案。春节后来核实——众所周知的是 .me 域名已经被拉黑了,掉绑之后再也绑不上,但在国内有备案好商量,所以我只能选择:切。

之前「空之领域」用的一直是 WordPress,但太久没用 PHP 的情况下维护 PHP 全家桶 + 数据迁移实在是太麻烦了,本身 WordPress 这种直接转成 HTML 的文章也不好备份和管理,八百年前我就想写 Markdown 了,只是实在太懒了一直没切,被逼勤劳之下开始干活,选了半天,还是选择了大家都在用的 hexo(此处心路历程不在本文的讨论中)。

另外需要注意到是,评论无了,如果是重评论内容,建议继续用。

导出数据

使用 wordpress-export-to-markdown,从 WordPress 后台找到 Export,把所有内容导出来(包括博文和页面)。使用这个程序处理,会导出一系列 Markdown。

配置 hexo

这个很简单,挑一个主题,然后把文章原样放进去,之后就可以直接管理 markdown 文件:

hexo new post
hexo new page

主题选了 next,虽然已经是烂大街了但确实少了很多成本,我的原则依旧是写博客就关注内容本身就可以了,烂大街就烂大街吧,问题不大。

处理文章

在第一次的 hexo server 启动过后,我们发现转换的文章还是有点问题的:

  1. Read More 标记无了
  2. 取得 tag 和 categories 是 slug 而不是正文内容

针对这两个问题写了两个脚本,核心思想是遍历加文本处理加重新存文件:

增加 read more 标签

在 20 行会增加 readmore,如果你的文章一行内容不是太多的话,应该断的还是比较合适的

def addReadMore():
    for dirpath, dnames, fnames in os.walk("./source/_posts/"):
        for f in fnames:
            if f.endswith(".md"):
                print(dirpath + '/' + f)
                contents = ''
                with open(dirpath + '/' + f, 'r') as a:
                    list = a.readlines()
                    list = list[0: 20] + ['<!--more -->'] + list[20:]
                    contents = ''.join(list)
                    a.close()
                with open(dirpath + '/' + f, 'w') as a:
                    a.write(contents)
                    a.close()

Tag 和 Categories 重新映射

这里可以选择连接 DB or 人肉 Mapping,考虑到我的 tags 和 categories 的数据量不大,直接采用了人肉 mapping

mapping = {
  'rem': '特別紀念',
  'diary': '天の日記',
  'tsukkomi': '實時吐槽',
  'novel': '小天文字',
  'note': '學習筆記',
  'good': '轉載好料',
  'photo': '各種相冊',
  'tests': '考试',
  'charcater': '人格',
  'friendship': '友情',
  'novels': '小说',
  'bizarre': '奇幻',
  'wraith': '妖灵',
  'trans': '转载',
  'classic': '经典',
  'school': '校园',
  'daily': '日记',
  '65': '日记',
  'software': '软件',
  'erciyuan': '二次元',
  'notice': '公告',
  'renew': '更新',
  'code': '代码',
  'contest': '竞赛',
  'beau-acticle': '美文',
  'timely': '实时',
  'edu': '教育',
  'hotdebate': '热议',
  'network': '网络',
  'comment': '评论',
  'essay': '随记',
  'travelnotes': '游记',
  'course': '教程',
  'comprehension': '作文',
  'teacher-student': '师生',
  'fujian': '富坚义博',
  'comments': '点评',
  'download': '下载',
  'notes': '笔记',
  'itnet': '互联网',
  'pack': '整合',
  'photos': '相册',
  'autobiography': '自传',
  'personal': '人物',
  'anniversary': '周年'
}

notIncluding = set()

def mapToCh(i):
    if not i in mapping:
        notIncluding.add(i)
    return mapping[i] if i in mapping else i

def translateTags():
    for dirpath, dnames, fnames in os.walk("./source/_posts/"):
        for f in fnames:
            if f.endswith(".md"):
                print(dirpath + '/' + f)
                contents = ''
                with open(dirpath + '/' + f, 'r') as a:
                    list = a.readlines()
                    idx = list.index('---\n', 1)
                    subList = list[0:idx]
                    currList = ['  - "' + mapToCh(i[5:-2]) + '"\n'
                        if i.startswith('  - ') else i
                        for i in subList]
                    list = currList + list[idx:]
                    contents = ''.join(list)
                    a.close()
                with open(dirpath + '/' + f, 'w') as a:
                    a.write(contents)
                    a.close()
    print(notIncluding)

配置 Nginx

nginx 成功从一坨 PHP fpm 配置中解放,回归到了静态资源文件的管理中,最简单的 demo 版本大致长这样,其他按照自己的需求自行修改:

server {
    listen 80;
    listen 443;
    server_name xsky.me;
    root /usr/share/nginx/blog/public;
    index index.html;
    location / {
    }
}

CI & CD

大部分人的 Hexo 用法其实是结合 GitHub Pages,这样确实轻松愉快,但是我们这里为了解决备案问题,仍然没有放弃机器,但是文章的管理、发布肯定还是结合 git + CI CD 的快,这里我用了 GitHub Actions 进行操作,本质上是 SSH 远程命令操作:

name: CI

# Controls when the action will run. 
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
    - name: executing remote ssh commands using password
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        password: ${{ secrets.PASSWORD }}
        port: 22
        script: |
          cd /usr/share/nginx/blog
          git pull github master --rebase 
          npm install
          hexo generate

这里需要注意,secret 变量请在项目的 Settings - Secrets 中设置并引用。

最后

Push & 测试全流程,Done。如果不确定源文件内部是否填写了一些你觉得敏感的内容,请把仓库至于 private。

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 知识

添加新评论