前言
前一段时间受疫情所赐, 享受了一个额外的寒假. 于是便有了时间来琢磨一下个人博客的事.三年前从Jekyll迁移到了Hexo, 享受到了它的简洁高效之后, 又对更美更灵活产生了向往. 便用了一天时间从Hexo迁移到了WordPress, 期间踩了一些坑, 也写了几个工具, 遂做笔记记录下来, 希望能帮到你.
太长不看的同学, 也可以直接访问使用这个项目中的脚本https://github.com/onekyle/MarkdownToWordPress
为什么是WordPress
- 主题丰富
- 免费开源
- 插件丰富
- 更好的SEO
- ...
创建Wordpress
网上案例颇多,再次就不做赘述, 具体可以参考这篇Docker-compose 安装 WordPress 博客.
将文章迁移到wordpress
之前文章都是基于Markdown来写的, 迁移到WordPress上有两种方式. 一种是通过RSS导入, 另一种是通过脚本将md转换成html 在通过xmlrpc上传. 个人最后是使用了第二种.
~~基于RSS导入~~
基于RSS导入是比较快捷的方式. 在Hexo目录下编辑_config.yml
:
feed:
type: rss2
path: rss2.xml
limit: 0
hub:
content: true
执行hexo g
之后将生成的xml
文件导出 在使用WordPress提供的RSS Importer导入即可.
这样操作是非常简单快捷, 但是存在一些我个人无法接受的缺憾:
1. 由于使用的md编辑软件的问题 可能会在源文件中插入一些无关字符 导致生成的rss.xml文件无法被导入, 为了定位问题 要不停的验证xml 不停的使用vim更改源文件.
2. 使用RSS导入的文章 时间统一采用的当前导入时间,分类以及标签都无法被有限保存使用.
3. 导入的文章中 存在代码块无法有效友好展示的bug
4. 很多WordPress主题都支持缩略图, RSS导入的文章是无法直接利用的 需要后期在做更改.
如此, 在尝试过一番之后, 我便作罢 开始着手编写脚本来实现迁移.
使用脚本进行迁移
自3.5版本以来,WordPress默认情况下开启了一个XML-RPC接口, 而python
中也有wordpress_xmlrpc, 我们便利用此,将文章迁移到我们的WordPress博客上.
具体脚本已经开源, 请参看md2wp.py.
使用hexo命令生成的md文章模板, 头部会有yaml格式的元数据. 大体长这个样子:
---
title: 从Hexo迁移到WordPress
date: 2020-03-22 11:14:46
tags: [分发]
category: [开发环境]
---
我们将其与文章内容都读取出来:
import frontmatter
def run(path: str):
post = frontmatter.load(path)
post_title = post.metadata.get('title', None)
date = post.metadata.get('date', datetime.date.today())
post_date = date
post_content = post.content
# 分类和标签
post_tags = post.metadata.get('tags', None)
post_category = post.metadata.get('category', None)
...
terms_names = {}
terms_names['post_tag'] = post_tags
terms_names['category'] = post_category
再将md
文件内容转换成Html
:
post_content_html = convertMd2HTML(post_content)
def convertMd2HTML(content: str) -> str:
post_content_html = markdown.markdown(
content, output_format='html5', extensions=['extra'])
return post_content_html
最后将数据传递给WordPressPost
这一对象, 通过wordpress_xmlrpc
发布上去
def run(path: str, wp: Client):
...
post = WordPressPost()
post.title = post_title
post.date = post_date
post.content = post_content_html
post.terms_names = terms_names
# post.post_status有publish发布、draft草稿、private隐私状态可选,默认草稿。如果是publish会直接发布
post.post_status = 'publish'
# 推送文章到WordPress网站
wp.call(NewPost(post))
另外 脚本中还支持缩略图上传和使用.就不展开细讲了.
如果没有出错, 然后你登录网站后台查看, 你的文章已经完美的被迁移了.