ブログを WordPress から Hugo に乗り換えました
長らく WordPress で運用してきたこのブログ「dyama's page」を、静的サイトジェネレーターの Hugo に移行しました。2026年10月23日に本番を切り替えています。
見た目はかなり簡素になりましたが、過去の記事・画像・コメントはすべて引き継いでいて、以前の URL もそのまま辿れるようにしてあります。
なぜ乗り換えたか
WordPress は便利なのですが、サーバー上で PHP と MariaDB を動かし続け、本体・プラグイン・テーマの更新を追いかける必要があります。ブログを書く頻度に対して、維持の手間とセキュリティの心配が見合わなくなってきました。特に2026年10月21日からの PHP 脆弱性の世界的な騒動で、稼働中の WP 構成の PHP にパッチを当てて一旦は回避したものの、兼ねてから脱 WP を目指していたことと昨今は AI の支援で力技も使えるようになってきたことから、重い腰を上げようと考えました。
記事を手元の Markdown ファイルで書き、手元で HTML に変換してサーバーにはファイルを置くだけ、という形にすれば、サーバー側でプログラムが動かないので管理がぐっと楽になります。ちなみに記事を Markdown で書くようにしたのは、既に 2014年に WordPress の投稿を Markdown にしたときからなのですが、その後の WordPress のバージョンアップにともない標準の書き方に戻っていました。
最初は docsify で試した
実は最初は、昔使ってみていた MDWiki を調べていました。これは既に開発が停滞しているらしいです。そこで docsify で全記事を移植してみました。Markdown をそのまま置いておけばブラウザ側で表示してくれるので手軽です。
ただ、docsify は URL がハッシュ (/#/...) になり、ページの中身もブラウザ側で描画されるため、検索エンジンにはあまり優しくありません。やっぱり SPA だと検索エンジンとの相性が悪いですね。
このブログは検索から来てくださる方が多いので、ちゃんと HTML を出力する GSS の Hugo に方針を変えました。
※ X で「Hugo がおすすめ」とリプライをいただいたのですが、記事執筆時点ではリプライしてくれた方のアカウントは凍結されている模様です。
移行作業
やったことはざっくり次のとおりです。
- WordPress の REST API で全記事を取得
- pandoc で HTML から Markdown に変換し、Hugo の原稿の形に整形
- 画像をすべてローカルに取得 (URL は WordPress 時代の
/wp-content/uploads/...のまま) - 過去のコメントや、下書き・非公開の記事もまとめて移植
移植した量はこんな感じです。
| 項目 | 件数 |
|---|---|
| 投稿 | 629 |
| 固定ページ | 16 |
| カテゴリ | 25 |
| タグ | 188 |
| コメント・ピンバック | 284 |
| 下書き・非公開の記事 | 39 |
記事から直接参照している画像だけで 500MB ほどありました。2009年頃から17年間分の記事にしては、思ったよりもコンパクトです。
WordPress の時点で壊れていたものも直した
移行のついでに全ページを描画して元のサイトと見比べたところ、WordPress の時点ですでに壊れていたものがけっこう見つかりました。
- 使わなくなったプラグインのショートコード (
[bash]や[math]など) が、そのまま文字で表示されていた - WordPress の自動整形で、コード中の記号が全角の引用符などに化けていた
- コードが二重にエスケープされて
<のようになっていた - ギャラリーの画像が消えていた (Wayback Machine から復元)
- リンク切れ、表の崩れ
17年分のブログとなると、プラグインの入れ替えのたびに少しずつ壊れていたようです。気付いた記事はちょくちょく更新していたのですが、やはり人力には限界がありますね。 記事に埋め込んでいる JavaScript のツール類も、表示と動作を一つずつ確認しました。
URL について
新しい記事の URL は /年/月/記事ID/ の形にしました。記事 ID は WordPress の投稿 ID をそのまま使っています。
以前の URL にアクセスすると、nginx で新しい URL に 301 転送されます。切り替え後に全 1,777 項目を本番で確認して、すべて正しく表示・転送されることを確かめました。リンクを貼ってくださっている方は、そのままで大丈夫です。
固定ページ・カテゴリ・タグ・画像の URL は WordPress のときと同じです。
変わったこと
- コメント欄はなくなりました。 過去のコメントは各記事の末尾にそのまま残しています
- サイト内検索は Google のサイト内検索になりました。
- 見た目は自前の簡素なテンプレートです。古い記事は当時のテーマに合わせたレイアウトだったので、多少見た目が変わっているものがあります
サーバーも整理した
WordPress がいらなくなったので、ついでにサーバーも大掃除しました。
- Debian 12 から 13 にアップグレード
- WordPress、PHP、MariaDB のほか、昔遊びで入れていた InfluxDB や Grafana なども撤去
- Let's Encrypt の証明書の自動更新が、実は以前から失敗する設定になっていたのを修正
今は nginx が静的なファイルを返すだけのサーバーになりました。 これにより S3 + CloudFront + ACM に移行することもできるようになったので、そちらも今後検討していきたいですね。
記事の書き方
新しい記事は、手元でこんな流れで書いています。
./new-post.sh "タイトル" # 記事ファイルを作る
./preview.sh # http://localhost:1313/ でプレビュー
./deploy.sh # HTML を出力して、リンク切れを検査して、サーバーに rsync
原稿は git で管理していて、デプロイのついでにサーバーにもバックアップしています。Hugo はバージョンを固定するために本体をリポジトリに同梱しました。
AI に手伝ってもらった
今回の移行作業は、ほぼ全部 AI と一緒にやりました。記事の取得・変換スクリプトから、壊れた記事の洗い出し、nginx の転送設定、サーバーのアップグレードまで、1日で終わってしまいました。
自分一人でやっていたら、壊れていた古い記事の修正までは手が回らなかったと思います。
おわりに
というわけで、新しい環境になった dyama's page を今後ともよろしくお願いします。おかしな表示やリンク切れを見つけたら、教えていただけると助かります。