あっきぃ日誌

ラズピッピブログのようなオタクブログのようななにか

WordPressからHugoに移行する

OSAkkie開発日誌とかいう古のブログアーカイブを、WordPressからHugoに移行しました。

shrimp.marokun.net

サーバー移行の前にOSをUbuntu20.04から24.04に上げたいけど、PHPスクリプトの管理を減らしたいので減らそうという、ついでのついでのついでみたいなやつの一環ですが、もう更新することがないWordPressが生きている必要はなく、むしろスパムだの攻撃だのの標的にさらされるので、静的化はしておいたほうが良いですよね。

当初は、上記と同じような理由でちょっと前にDokuWikiからMDWikiを使って静的化された、イグOSC賞というページ( https://d250g2.com/igoscaward/ )の例を踏襲して、MDWikiを使おうとしていましたが、どうやら使用したエクスポートツールがHuge向きのヘッダーをつけてくれていて、せっかくなのでHugoにしました。

エクスポートと変換ツール

エクスポートはWordPressの標準機能で全部出力。

Markdownへの変換はwordpress-export-to-markdownを使用しました。

GitHub - lonekorean/wordpress-export-to-markdown: Converts a WordPress export XML file into Markdown files.

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

がしかし、なんかエラーに。タグの文字列にマルチバイトが含まれているとだめらしいので、日付ベースの名前に変更します。スクリプトで雑にゴリッとやりました。こいつから得られた新しいXMLで再度変換します。

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コマンドで生成。テーマの設定周りに時間がかかりましたが、生成自体はあっという間なので良いですよね。

完成

古のサイトが、モダンなデザインになりました。しかも軽い(ただのHTMLなので)。WordPressのテーマが古かったせいもありますが、文字が気持ち大きくなって読みやすくもなりました。

いままでありがとうWordPress。これからはHugoとMarkDownで残していくぞ。