Movable TypeからWordPressに移行

Movable TypeからWordpressに手動で移行してたんだけど、ここ10年ぐらいはともかくそれより古いコンテンツはかなり自動でいけそうなので、HTML Import 2というプラグインを試したけど投稿日付を抜き出せないので、PythonでHTMLをパースしてWP APIを叩いて放り込むスクリプトを書いた。どうせ使うのは1回きりなので、エラーハンドリングも注記もなんも無し。

とはいえ、これが分かる人は自分で書くだろうし、分からない人はプラグインを使うだろうし需要無さそうw

import requests
import base64
import glob
import sys
import os
import re

MY_URL = "https://hoge.com"
MY_USER = "admin"
MY_APP_PASSWORD = "API KEY HERE"

credentials = MY_USER + ':' + MY_APP_PASSWORD
token = base64.b64encode(credentials.encode())
headers = {'Authorization': 'Basic ' + token.decode('utf-8')}

def create_post(post) -> dict:
    res = requests.post(f"{MY_URL}/wp-json/wp/v2/posts/", headers=headers, json=post)

if len(sys.argv) != 2:
    sys.exit('specify a path')
path = sys.argv[1]

# Movable Type tags
dtre = re.compile(r'time datetime="([^"]+)" itemprop="datePublished"')
tlre = re.compile(r'<h2 itemprop="name" class="asset-name entry-title">([^<]+)</h2>')
stdiv = re.compile(r'<div class="entry-content asset-content" itemprop="articleBody">')
eddiv = re.compile(r'<nav class="page-navigation entry-navigation pagination content-nav">')

for p in glob.iglob(path + "/**/*.html", recursive=True):
    if os.path.isfile(p):
        with open(p) as f:
            datetime = ''
            title = ''
            wk_content = ''
            content = False
            for line in f:
                m = tlre.search(line)
                if m != None:
                    title = m.groups()[0]
                    continue

                m = dtre.search(line)
                if m != None:
                    dt = m.groups()[0]
                    continue

                m = stdiv.search(line)
                if m != None:
                    content = True
                    continue

                m = eddiv.search(line)
                if m != None:
                    content = False
                    break

                if content == True:
                    wk_content = wk_content + line.strip()

            wk_content = wk_content.replace('<p>', '')
            wk_content = wk_content.replace('</p>', '\n\n')
            wk_content = wk_content.rstrip('</div>')
            post = {
                'title': title,
                'status': 'draft',
                'content': wk_content,
                'date': dt,
                'modified': datetime,
            }
            create_post(post)

ブロックエディタにするなら、以下。

--- wp_post.py	2021-10-24 23:02:53.000000000 +0900
+++ wp_post.py.new	2021-10-24 23:02:13.000000000 +0900
@@ -56,8 +56,8 @@ for p in glob.iglob(path + "/**/*.html",
                 if content == True:
                     wk_content = wk_content + line.strip()
 
-            wk_content = wk_content.replace('<p>', '')
-            wk_content = wk_content.replace('</p>', '\n\n')
+            wk_content = wk_content.replace('<p>', '<!-- wp:paragraph -->\n<p>')
+            wk_content = wk_content.replace('</p>', '</p>\n<!-- /wp:paragraph -->\n\n')
             wk_content = wk_content.rstrip('</div>')
             post = {
                 'title': title,