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,