WordPressからHugoへ移すときのURL設計

シリーズ「Hugo移行記」の記事

WordPressからHugoへ移すとき、最初は旧記事のURLをすべて再現できるようにしました。ただし、再現できることと、今後も公開することは別の判断です。

haruki256.comでは旧記事の内容を確認し、13本すべてを非公開で保管することにしました。新しく公開する記事は、WordPress時代と同じ日付入りの形式を使い、slugを英小文字のkebab-caseに統一します。この記事では、そこに至るまでの確認とURLの決め方をまとめます。

まず全体像

WordPressの旧記事とURLを確認し、旧記事13本は非公開で保管し、新規記事は英語slugで作り、最後にHugoの公開対象一覧を確認する流れ
URLを設定する前に、旧記事を今後も公開するか決めました。今回は旧記事を公開せず、新しい記事だけを英語slugで公開します。

最初にWordPressのURL規則を確認した

WordPress側で確認したパーマリンク設定は、次の形でした。

/%year%/%monthnum%/%day%/%postname%/

たとえば、2022年2月16日に公開した「今後作成する作品について」は、日本語のスラッグを使っていました。

/2022/02/16/今後作成する作品について/

WordPressで公開されていた記事は7本です。ほかに旧下書きが6本ありました。移行作業では、合計13本の本文をMarkdownへ変換して手元に保管しています。

公開されていた7本については、公開日時、スラッグ、元のURLも取り出しました。まず同じURLを再現できる状態にしてから、記事ごとに公開を続けるか判断するためです。

旧記事13本は公開しないことにした

移植後に内容を見直すと、短い学習メモ、現在の方針から外れる記事、公開時点から情報が変わり得る記事が含まれていました。現在の執筆ルールへ合わせてすべて書き直すより、新しい記事から始めることにしました。

旧記事のMarkdownは削除しません。content/drafts/ に置き、Hugoの本番ビルドから外します。

以前の公開URLは、front matterの legacy_url に記録しました。

---
title: "今後作成する作品について"
date: 2022-02-16T21:35:35+09:00
slug: "今後作成する作品について"
legacy_url: "/2022/02/16/今後作成する作品について/"
archived: true
---

legacy_url は、このブログで記録用に使う項目です。Hugoの公開先には影響しません。archived: true の記事は、下書きを含めたローカル一覧にも出さないようにしています。Hugoが公開先として扱う標準の url とは分けています。

公開しない旧記事を、新しい無関係な記事やトップページへ転送することもしません。Hugoへ切り替えた後は通常の404とします。今後、旧記事を再公開する場合だけ、内容と転送先を改めて決めます。

再公開する旧記事にも日本語slugは使わない

今後の公開URLは、記事とショートのどちらも英小文字のkebab-caseに統一します。

「今後作成する作品について」を将来書き直して公開する場合も、日本語slugは使いません。内容に合う英語slugを決め、旧日本語URLから新URLへ転送します。

再公開しない限り、新URLと転送設定は作りません。記事を公開するか決めてからURLを決めます。

新規記事は共通のpermalink規則を使う

新しい記事のURLを毎回手入力すると間違いが増えます。そこで、WordPress時代と同じ日付入りの形式をHugoへ設定しました。

hugo.toml の設定は次のとおりです。

[permalinks]
posts = '/:year/:month/:day/:slug/'

:year:month:day はfront matterの date から取得されます。:slug はfront matterの slug です。

たとえば、この記事では次の2項目からURLが決まります。

date: 2026-07-21T10:15:00+09:00
slug: "wordpress-to-hugo-url-design"

生成されるパスは次の形です。

/2026/07/21/wordpress-to-hugo-url-design/

日付部分は共通設定から作り、記事ごとに短い英語slugだけを決めます。

記事フォルダは管理しやすさで決める

Hugoは初期状態では、content 配下のファイルパスを基にURLを作ります。ただし、permalink設定を使えば、保存場所と公開URLを分けられます。

このブログでは、公開記事を content/posts/<年>/、下書きを content/drafts/ に置いています。下書きを公開するときは記事フォルダを posts へ移しますが、URLの日付とスラッグはfront matterから決まります。

フォルダ名は、手元で記事を探しやすくするために使います。読者がアクセスするURLは、Hugoの設定とfront matterで管理します。

公開予定の記事だけが出ることを確認する

URLの確認では、同じパスを作れるかだけでなく、非公開にした記事が本番へ混ざっていないかも確認します。

Hugoでは、次のコマンドで公開対象とpermalinkを一覧にできます。

hugo list published

本番ビルドでは、旧記事13本が一覧に出ないことを確認します。新しい記事を公開するときは、次の点を確認します。

  • 公開予定の記事だけが一覧にある
  • slugが英小文字のkebab-caseになっている
  • 年、月、日がfront matterの date と一致する
  • URL末尾に / がある
  • 旧記事の legacy_url が公開先として使われていない
  • 転送は、書き直して再公開する旧記事だけに設定する

記事URLとは別に、カテゴリ一覧や固定ページのURLも確認します。必要な転送は、本番切り替え前に別の一覧で管理します。

まとめ

WordPressの旧記事は、URLを再現できることを確認してから、今後も公開するか判断しました。今回は13本すべてを非公開で保管します。

新しい記事は /:year/:month/:day/:slug/ からURLを作り、slugを英小文字のkebab-caseに統一します。日本語URLの旧記事を将来書き直す場合は、新しい英語URLを作り、旧URLから転送します。

本番を切り替える前には、公開予定の記事だけがHugoの一覧へ出ることを確認します。次は、記事本文をHugo専用の記法に寄せすぎないために決めた構成をまとめます。