Hugo で多くのコンテンツを作成する場合、記事の種類ごとにセクション(ディレクトリ)に分けて管理することになります。 このような場合、各ページのタイトルに対して、セクションのタイトルを自動で付加できれば、ページタイトルの管理が楽になります。
何をするか?
例えば、次のようなセクション構造で記事を管理しているとします。
contents/
+-- _index.md (home page)
+-- section1/
| +-- _index.md (section page)
| +-- page1.md (single page)
| +-- page2.md (single page)
| +-- page3.md (single page)
+-- section2/
+-- _index.md (section page)
+-- ...
各ディレクトリにある _index.md は、セクションページのコンテンツファイルとして使用されます。
このファイルのフロントマターには、下記のようにセクションのタイトルを記述することができます。
---
title: "セクション1"
date: "2019-05-17"
---
セクションページの本文…このセクションタイトルは、セクションページ(このケースでは https://example.com/section1/)にアクセスしたときに使用されるものですが、同じセクションに所属する記事ページのタイトルのプレフィックスにも自動で付加できると便利です。
例えば、section1 に所属する記事ページとして下記のようなコンテンツがあるとします。
---
title: "タイトル1"
date: "2019-05-17"
---
ページの本文…このように記述されているときに、表示するタイトルを タイトル1 ではなく、セクション1: タイトル1 のようにしたいということです。
このように、セクションタイトルを付加することで、あるページを単独で表示したときに、どのような階層に配置された記事なのかが分かりやすくなります。
セクションプレフィックスの実装
ここでは、シングルページテンプレートで、セクションプレフィックスの仕組みを実現する方法を示します。
下記の例では、構築したページタイトルを $pageTitle という変数に格納しています。
{{ $pageTitle := cond (eq .CurrentSection.Section "") (.Title) (printf "%s: %s" .CurrentSection.Title .Title) }}
<h1>{{ $pageTitle }}</h1>コンテンツのルートディレクトリ (contents) に配置したページにアクセスしたときは、.CurrentSection.Section の値が空 ("") になることを利用して、ページのタイトルをそのまま表示するようにしています。
h1 要素で表示上のページタイトルを設定していますが、head 要素下の title 要素にも同様に設定するようにしてください。
Google などの検索エンジンは、title 要素に指定したページタイトルを表示します。(応用)セクションプレフィックス用のプロパティを用意する方法
上記の例では、セクションプレフィックスとして、自分が所属するセクションのセクションページに設定された title プロパティの値を使用していました。
ここでは、セクションプレフィックス用に、独自のプロパティ sectionPrefix を参照するようにしてみます。
このようなケースでは、Hugo の Front Matter Cascade という機能を使用すると便利です。 例えば、セクションページのフロントマターで次のように記述しておくと、
---
title: "セクションタイトル1"
cascade:
sectionPrefix: "セクション1"
---このセクション内の記事では、.Params.sectionPrefix 変数で セクション1 という値を参照できるようになります。
親セクションのフロントマターで cascade: 以下に設定したプロパティを、すべての子ページから参照できるということです。
下記はテンプレートの実装例です。
{{ $pageTitle := .Title }}
{{ if ne .Kind "section" }}
{{ with .Params.sectionPrefix }}
{{ $pageTitle = printf "%s: %s" . $pageTitle }}
{{ end }}
{{ end }}
<h1>{{ $pageTitle }}</h1>現在のページがセクションページでなければ、sectionPrefix プロパティの値をタイトルの前に連結する、という処理になっています。
