WordPressをHugoでアーカイブした話
Ablazeのブログは長らくWordPressで動いていました。
WordPressは非常に人気がありますが、セキュリティ上の問題が多く安全に運用する難易度が高い、プラグインへの依存度が高くメンテナンス性に難があるなどの問題を多く抱えており、ブログのシステムをGhostに移行することとなりました。
過去の記事はアーカイブサイトにリダイレクトしようということになり、5年間運用されていたWordPressの記事(と大量のメディア)をHugo + Cloudflare Pagesの構成に移行した話を、このブログでの記念すべき最初(?)の技術記事にしようと思います。
第一の壁: WordPressのエクスポートデータの変換
最初、専用のプラグイン (https://github.com/SchumacherFM/wordpress-to-hugo-exporter )での変換を試みましたが、タイムアウトしてしまい上手くいきませんでした。
この時点で、これが最も難易度の高いステップに思ってましたが、世の中にはなんと既にWordPressのエクスポートデータをHugoのプロジェクトに変換するという大変ありがたいツールが存在していました。
早速GitHubにリポジトリを作成し、Codespacesを立ち上げ変換作業に取り掛かりました。特にエラーもなく無事終了し、Hugoのアーカイブ版サイトを立ち上げるステップまでスムーズに進めました。
第二の壁: 動かないOGP
wp2hugoが出力するMarkdownがやや特殊なせいで、生成された状態だとOGPが動作しないことが分かりました。SNS時代にOGPが表示されないブログはかなり致命的なので、テーマのテンプレートファイルを以下のサイトを参考に手動で修正し、フォールバック画像を設定することで解決しました。

第三の壁: WordPressの特殊な画像パス
いざデプロイしてみても、画像が正しく表示されないことに気づきました。
最初、wp2hugoがダウンロードするメディアが不足しているのではないかと思い--download-all オプションを追加して生成し直してみましたが、やはり上手く表示できません。
F12コンソールで確認すると、どうやら/wp-content/uploads/hoge/fuge/001.pngというファイルに対し、/wp-content/uploads/hoge/fuge/001-1024x657.png というURLで画像が参照されていることが分かりました。私はWordPressに詳しくないのでこれがデフォルトの動作なのか、プラグインによるものなのかは分かりませんが、幸いなことに私たちはLLMという文明を使えばすぐに欲しい正規表現を手に入れられる時代に生きています。
find . -type f -name "*.md" -print0 | xargs -0 sed -i -E 's/-[0-9]+x[0-9]+\.png"/.png"/g'今後やりたいこと
画像は表示できるようになりましたが、やや巨大な画像が一部の記事に混ざってるのでffmpegか何かとbashで一定サイズ以上のファイルは縮小することを考えています。ただWebPを使用して画質を保ったまま小さくしようとすると拡張子が変わってしまう問題があるので、それの解決にまた工夫が必要になりそうです。
まとめ
PHPで動作するWordPressと比較し、静的サイトを出力してくれるHugoのブログは非常に扱いやすいです。記事を書きにくいという欠点はありますが、アーカイブサイトであれば全く問題ではありません。
CloudflareとSSGのありがたさを改めて実感した一日でした。