WordPressからHugoへ移すとき、最初は旧記事のURLをすべて再現できるようにしました。ただし、再現できることと、今後も公開することは別の判断です。
haruki256.comでは旧記事の内容を確認し、13本すべてを非公開で保管することにしました。新しく公開する記事は、WordPress時代と同じ日付入りの形式を使い、slugを英小文字のkebab-caseに統一します。この記事では、そこに至るまでの確認とURLの決め方をまとめます。
まず全体像
最初に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専用の記法に寄せすぎないために決めた構成をまとめます。