OSAkkie開発日誌とかいう古のブログアーカイブを、WordPressからHugoに移行しました。
サーバー移行の前にOSをUbuntu20.04から24.04に上げたいけど、PHPスクリプトの管理を減らしたいので減らそうという、ついでのついでのついでみたいなやつの一環ですが、もう更新することがないWordPressが生きている必要はなく、むしろスパムだの攻撃だのの標的にさらされるので、静的化はしておいたほうが良いですよね。
当初は、上記と同じような理由でちょっと前にDokuWikiからMDWikiを使って静的化された、イグOSC賞というページ( https://d250g2.com/igoscaward/ )の例を踏襲して、MDWikiを使おうとしていましたが、どうやら使用したエクスポートツールがHuge向きのヘッダーをつけてくれていて、せっかくなのでHugoにしました。
エクスポートと変換ツール
エクスポートはWordPressの標準機能で全部出力。
Markdownへの変換はwordpress-export-to-markdownを使用しました。
nodeを直に実行するのは嫌なので、Dockerでやりました。Dockerfileはこんな感じ。
FROM node RUN git clone https://github.com/lonekorean/wordpress-export-to-markdown WORKDIR ./wordpress-export-to-markdown RUN npm install
んで、実行はこう。
docker run --rm -it -v `pwd`/osakkie.xml:/wordpress-export-to-markdown/export.xml -v `pwd`/output:/wordpress-export-to-markdown/output <docker tag or image id> node index.js
がしかし、なんかエラーに。
with open('osakkie.WordPress.2025-02-02.xml') as f: lines = f.readlines() for l in lines: if '<wp:post_date>' in l: post_date = l.split("CDATA[")[1].split("]]")[0].replace('-', '').replace(':', '').replace(' ', '-') if 'wp:post_name' in l: print(" <wp:post_name><![CDATA[%s]]></wp:post_name>"%post_date) else: print(l.rstrip())
ブログはカテゴリーで管理していましたが、hugoではタグのほうが良さそうだったので、各ファイルのCategoriesをTagsに置き換えました。
$ find output -name index.md | xargs sed -i 's/^categories/tags/g'
投稿者がサポートされていなかったので、これもsedでテキトウに埋め込みます。
$ find . -name index.md | xargs sed -i 's/^date:/authors:\n - akkie\ndate:/g'
さらに、コメントが変換に含まれていなかったので、コメントをXMLファイルから抽出しました。幸い、コメント件数が7〜8個だったので、各投稿に人力で埋め込みましたが、変換ツールに合わせた加工量が多いのはちょっと萎えです。
with open('osakkie.xml') as f: lines = f.readlines() comment_body = False now = "" for l in lines: if '<wp:post_date>' in l: post_date = l.split("CDATA[")[1].split("]]")[0].replace('-', '').replace(':', '').replace(' ', '-') if '<wp:comment_author>' in l: if (now != post_date): print("[%s]\n"%post_date) now = "%s"%post_date print("* Name: %s"%l.split("CDATA[")[1].split("]]")[0]) if '<wp:comment_date>' in l: print("* Date: %s"%l.split("CDATA[")[1].split("]]")[0].replace('-', '/')) if '<wp:comment_content>' in l: comment_body = True print("* %s"%l.split("CDATA[")[1]) continue if comment_body: if '</wp:comment_content>' in l: comment_body = False print("%s\n"%l.split("]]")[0].replace('<br />',"\n").strip()) else: print(l.replace('<br />',"\n").strip())
結果はこんな感じになるので
[20080202-012508] * Name: あっきぃ * Date: 2008/02/02 01:31:24 * Title: あっきぃ テスト * Name: あっきぃ * Date: 2008/02/02 01:32:33 * Title: できた! よかったよかった。
適宜加工して完成。Titleの行については、WordPressより前の移行元であるWebflogの名残かもしれないです。
## Comments *** * Name: あっきぃ * Date: 2008/02/02 01:31:24 * Title: あっきぃ テスト *** * Name: あっきぃ * Date: 2008/02/02 01:32:33 * Title: できた! よかったよかった。
その他、本文とか画像のリンク類も置き換えで修正しました。
Hugo
サイト作成はドキュメントどおりに作って、テーマをいい感じに選び、設定を書いてコンテンツとauthorファイル等を作って、後はhugoコマンドで生成。テーマの設定周りに時間がかかりましたが、生成自体はあっという間なので良いですよね。