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
启动过后,我们发现转换的文章还是有点问题的:
- Read More 标记无了
- 取得 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。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。
hexo新站rss无了,求安排上