Hugo で各種ページの .Kind や .IsPage、.IsSection、.IsNode の値がどうなるかの一覧

Hugo のテンプレートで、ページの種類によって条件分岐するコードを記述するには、レンダリング時のコンテキストにおいて、.Kind の値や .IsPage などの値がどう変化するかを知っておく必要があります。

ページ種類.RelPermalink の例.Section.Type.Kind.IsHome.IsNode.IsPage.IsSection
ホームページ/nilpagehometruetruefalsefalse
セクションページ(第 1 階層)/sec1/sec1sec1sectionfalsetruefalsetrue
セクションページ(第 2 階層)/sec1/sec2/sec1sec1sectionfalsetruefalsetrue
タクソノミーターム/tags/tagstagstaxonomyfalsetruefalsefalse
タクソノミーリスト/tags/xxx/tagstagstermfalsetruefalsefalse
404 ページnilnilpage404falsetruefalsefalse
記事ページ(第 1 階層)/mypage/nilpagepagefalsefalsetruefalse
記事ページ(第 2 階層)/sec1/mypage/sec1sec1pagefalsefalsetruefalse
記事ページ(第 3 階層)/sec1/sec2/mypage/sec1sec1pagefalsefalsetruefalse
☝️ ※ taxonomy と term という名前 Hugo v0.73 において taxonomyTerm → taxonomytaxonomy → term という .Kind 値の変更が入っているので、バージョンアップ時はご注意ください。

上記の値は、次のようなテンプレートコードを、ベーステンプレート (layouts/_default/baseof.html) に記述して調べています(2020-04-27: .IsSection を追記、.URL (deprecated) を .RelPermalink に変更)。

<pre>
.RelPermalink = {{ .RelPermalink }}
.Section = {{ .Section }}
.Type = {{ .Type }}
.Kind = {{ .Kind }}
.IsHome = {{ .IsHome }}
.IsNode = {{ .IsNode }}
.IsPage = {{ .IsPage }}
.IsSection = {{ .IsSection }}
</pre>

これらの情報を使って分岐処理するときの方針としては、まずは、大まかに .IsHome.IsNode.IsPage.IsSection の値で分岐できないかを考え、もう少し細かい分岐処理が必要であれば、.Kind の値を利用する、という感じにするとよいでしょう。

次の例では、title 要素のテキストを構築するときに、.IsHome の値を使って分岐処理しています。 ホームページの場合は「サイト名」だけを表示し、その他のページでは「ページタイトル|サイト名」のように連結して表示するようにしています。

<title>{{ if not .IsHome }}{{ .Title }}{{ end }}{{ .Site.Title }}</title>

あるいは、cond 関数を利用して次のように書くこともできます。

<title>{{ cond .IsHome .Site.Title (print .Title "|" .Site.Title)}}</title>