Hugoでカテゴリやタグの日本語URLを半角英数字URLにする
HexoからHugoへ乗り替える際、色々悩んでやっと日本語URL→半角英数字URLへの変換が出来たので、備考録を残すよ。
目次
変換手順
サイト設定(hugo.toml)をする
まずはURL(パーマリンク)の設定をします。
サイト設定(hugo.toml)に、タグとカテゴリのパーマリンクを設定(カテゴリは必要に応じて)。
|
|
ちなみに、他のセクションの下(下記の例ではnote
)にtags
ディレクトリを入れたい場合は、単純に、
|
|
とすれば良いです。
日本語タグにslugを設定
次に、各日本語タグ(カテゴリ)にslug
を設定します。
まず、サイト設定(hugo.toml)で設定したパーマリンクになるtags
のフォルダを作り、その下にslug
を設定する日本語タグのフォルダを日本語で作ります(例は「日記」タグ)。
- content
- tags
- 日記 ←作ったフォルダ
- tags
ちなみに、他セクション内(下記例ではnote
)にtags
ディレクトリがあるパーマリンクを設定しても、content
フォルダ直下にtags
フォルダを作らないと上手くURL変換が効きません。
- content
- note
- tags ←ここに作っても×
- 日記
- tags ←ここに作っても×
- tags ←必ずcontent直下にフォルダを作る
- 日記
- note
作った日本語タグのフォルダ内に_index.md
というMarkdownファイルを作り、以下のフロントマターを設定します(例はTOML形式)
|
|
テンプレートを設定
ここまで設定出来たら、あとは、例えばサイドバーなどにタグ一覧を出したい該当テンプレートのタグリンクのヵ所に
|
|
とか記入すれば、設定ファイルに記載したタイトルとslug
でパーマリンク(tags/diary/
)が表示されます。
もし、これで上手く行かなかったら、slug
ではなくパーマリンクそのものを設定できるurl
をフロントマターに設定します。
要はデフォルトのパーマリンクをフロントマターで設定するもので上書きするわけです。
slug
と書いていた所をurl
に直し、ルートからの絶対パスで設定します。(上記例だと、url = '/tags/diary/'
)
これで、該当箇所の
|
|
が
|
|
となります。
シングルページで使うなら、.Site.Taxonomies
よりも.GetTerms
の方が、記事のフロントマターで書いた順にタグが並ぶのでオススメ。
|
|
日本語URLが半角英数字URLになってスッキリ!
あとは、使用する日本語タグ(カテゴリ)全てに上記と同じ設定(tags
orcategories
フォルダ内に日本語で該当タグ(カテゴリ)名のフォルダを作り、_index.md
のフロントマターにtitle
とslug
orurl
を設定する)をします。
タグ(カテゴリ)名に使用する記号によっては正しくエンコードされないものもありました。
確認した限りでは「・(黒丸)」と「×(全角のバツ)」はエンコードされず飛ばされてました(「WEB・PC関係」は「webpc関係」に、「はやて×ブレード」は「はやてブレード」になった)ので、記号を使用する場合は、一旦日本語で書いてプレビューでURLがどうなるのか確認してからフォルダを作成するのが吉かと。
また、フロントマターにurl
を設定した場合は、各タグ(カテゴリ)のパーマリンクをそれぞれで設定しているので、サイト設定(hugo.toml)の[permalinks]
の項目で設定したタグ(カテゴリ)は削除しても良いです。
【おまけ】他セクション下にtagsセクションがくるようにパーマリンクを設定した際、ルート直下のtagsフォルダをレンダリングしないようにする
サイト設定(hugo.toml)でパーマリンクを
|
|
などにした際、ビルドするとちゃんとnote
フォルダ下にtags
フォルダが生成されます。
このnote/tags/
フォルダは、ビルド前はcontent/tags/
フォルダで、日本語タグ名で作成したフォルダを集めたルートになります。
つまりブランチバンドル=リストページです。
リストページ扱いなので作成しなくてもプレビューやビルドの際に自動で_index.md
が補完されます。
そして、元々の場所がcontent
フォルダ直下なので、プレビューやビルドされるとルート直下にもtags
というフォルダが作成され、その中にindex.html
が生成されます。
つまりこう。
- public
- css ←staticフォルダにあったフォルダ
- style.min.css
- imgs ←staticフォルダにあったフォルダ
- image.jpg
- note
- 20200101
- index.html
- 20210509
- index.html
- tags ←hugo.tomlでパーマリンクを設定したから作成されたフォルダ
- diary ←_index.mdのフロントマターのslugから作成されたフォルダ
- index.html
- page
- 1
- index.html
- 1
- diary ←_index.mdのフロントマターのslugから作成されたフォルダ
- 20200101
- tags ←ローカルで日本語タグ名フォルダを格納するために作ったフォルダ
- index.html
- page
- 1
- index.html
- 1
- css ←staticフォルダにあったフォルダ
このpublic/tags/index.html
は全タグの一覧リスト(つまり、「日記」とか「お絵かき」とかのタグ名のリスト)なので、必要ならテンプレートを整えると良いと思いますが、サイドバーやフッターメニュー等で一覧リストを出している場合は不必要かと思います。
これがindex.md
を内包するリーフバンドルならヘッドレスバンドルにすれば話は早いのですが、_index.md
を内包するブランチバンドルなので、明確にビルドしないように設定する必要があります。
content
フォルダ内のtags
フォルダ内に_index.md
を作成し、フロントマターに以下を設定します。
|
|
フロントマターで設定出来る _build オプションを設定しています。
- render :いつページをレンダリングするか。
- never :全てのページやリストに含めず、レンダリングしない。
これらを設定した後、hugo
コマンドでビルドすると、ルート直下にあったtags
フォルダがレンダリングされません。
テキストのみの小さいファイルでも、どこにも使用されない不要なファイルをレンダリングするのは余計だと思うので、しないに越したことはないかと思います。
Hexoからの乗り換えで一番困ってたことだった
Hexoは標準機能として、URLマッピングが備わっています。
設定ファイル(config.yml)で以下のように設定すると、日本語タグも半角英数字に変換出来ていました。
|
|
この機能があったからWordpressから静的サイトジェネレーターへ乗り替える際、Hexoを選んだと言っても過言ではありません。
なぜならURLに日本語を含む2バイト文字を使いたくないから。
URLエンコードされて正しく処理されるとしても、エンコードされてだらだらと長ったらしい文字列が並ぶよりも、半角英数字で見やすい&わかりやすいURLの方が精神的にも安心します。
Wordpressもタグやカテゴリなどには別途slug
が割り当てられていたので、こういうURLマッピングが出来るって普通なのかと思ってたんですけど、Hugoはそうじゃなかったんですよね……。
Hexoに完全に決めるまでは、HexoとHugoを平行して触っていたんだけど、ここだけどうにもならなかったのでHexoにした、みたいな。
で、紆余曲折ありHexoから乗り替えを決意してからの勉強中に何とかなったので、記事にしようと相成りました。
……しかし、ググったら既に解説してるサイトさんがあったのか……もっとちゃんと検索すればもっと早くヒントが得られたかもしれなかった……(笑)