从Hexo迁移到WordPress

前言

前一段时间受疫情所赐, 享受了一个额外的寒假. 于是便有了时间来琢磨一下个人博客的事.三年前从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))

另外 脚本中还支持缩略图上传和使用.就不展开细讲了.
如果没有出错, 然后你登录网站后台查看, 你的文章已经完美的被迁移了.

订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x