Skip to main content

タクソノミー テンプレート

タクソノミー テンプレートには、タクソノミー リストページ、タクソノミー用語ページ、シングルページ テンプレートでのタクソノミーの使用が含まれます。

Hugo では、タクソノミー と呼ばれる、ユーザーが定義したコンテンツのグループ化をサポートしています。タクソノミーとは、コンテンツ間の論理的な関係を示す分類のことです。Hugo がこの強力な機能をどのように活用しているか知らない場合は、コンテンツ管理の下の「タクソノミー」 を参照してください。

Hugo では、プロジェクト テンプレート全体でタクソノミを使用する方法が複数用意されています。

タクソノミー リスト テンプレート

タクソノミーのリストページのテンプレートはリストなので、リストページ で使用できるすべての変数とメソッドを備えています。

タクソノミー リスト テンプレートの検索順序

詳細は、「テンプレートの検索順序」 を参照してください。

タクソノミー用語テンプレート

タクソノミー用語テンプレートの検索順序

詳細は、「テンプレートの検索順序」 を参照してください。

タクソノミー メソッド

タクソノミーは、 map[string]WeightedPages です。

.Get(term)
用語の WeightedPages を返します。
.Count(term)
この用語に割り当てられているコンテンツの個数です。
.Alphabetical
用語順に並べられた OrderedTaxonomy (スライス) を返します。
.ByCount
エントリ数順に並べられた OrderedTaxonomy (スライス) を返します。
.Reverse
OrderedTaxonomy (スライス) を逆順で返します。 OrderedTaxonomy と共に使用する必要があります。

OrderedTaxonomy

マップは順序付けされないので、OrderedTaxonomy は定義された順序を持つ特別な構造です。

[]struct {
    Name          string
    WeightedPages WeightedPages
}

スライスの各要素には、以下のものがあります。

.Term
使用される用語です。
.WeightedPages
重み付きページのスライスです。
.Count
この用語に割り当てられているコンテンツの個数です。
.Pages
この用語に割り当てられているすべてのページです。すべての リストメソッド がこれに使用できます。

WeightedPages

WeightedPages は、 WeightedPage の単なるスライスです。

type WeightedPages []WeightedPage
.Count(term)
この用語に割り当てられているコンテンツの個数です。
.Pages
リストメソッド のいずれかを使用して並べ替えることができる、ページのスライスを返します。

タクソノミー用語テンプレートでカスタム メタデータを表示する

各タクソノミー用語のカスタム メタデータを表示する必要がある場合、「タクソノミー」のドキュメントで説明されているように 、その用語のページを /content/<TAXONOMY>/<TERM>/_index.md に作成し、そのフロントマターにメタデータを追加する必要があります。 Actors タクソノミーの例に基づき、タクソノミー用語テンプレートの中で、変数 .Pages を反復処理することにより、カスタムフィールドにアクセスできます。

<ul>
  {{ range .Pages }}
    <li>
      <a href="{{ .Permalink }}">{{ .Title }}</a>
      {{ .Params.wikipedia }}
    </li>
  {{ end }}
</ul>

タクソノミーを順序付けする

タクソノミーは、アルファベット順のキーまたはそのキーに割り当てられたコンテンツの数によって並べることができます。

アルファベット順の例

<ul>
  {{ range .Data.Terms.Alphabetical }}
    <li><a href="{{ .Page.Permalink }}">{{ .Page.Title }}</a> {{ .Count }}</li>
  {{ end }}
</ul>

タクソノミー内のコンテンツを順序付けする

Hugo では、dateweight の両方を使用して、タクソノミー内のコンテンツを並べます。

Hugo の各コンテンツには、オプションで日付を割り当てることができます。 また、割り当てられているタクソノミーごとに重みを割り当てることもできます。

タクソノミー内のコンテンツを反復処理する場合、デフォルトの並べ替えは、セクションページとリストページで使用されるものと同じで、最初に重み順、次に日付順です。 これは、2 つのコンテンツの重みが同じであれば、より新しいコンテンツが最初に表示されることを意味します。

コンテンツのデフォルトの重みは 0 です。ゼロは「重みがない」という意味であり、「数値ゼロの重みを持つ」という意味ではありません。

したがって、ゼロの重みは特別に扱われます。2 つのページの重みが等しくなく、そのうちの 1 つがゼロである場合、重みがゼロのページは、他のページの重みに関係なく、常に他のページの後に表示されます。 したがって、ゼロの重みは注意して使用する必要があります。たとえば、正と負の両方の重みを使用して順序を両方向に拡張すると、ゼロの重みのページがリストの中央ではなく最後に表示されます。

重みを割り当てる

コンテンツは、割り当てられたタクソノミーごとに重み付けをすることができます。

慣例では、 taxonomyname_weight とします。

上記の例では、このコンテンツは 22 の重みを持ち、’tag’ タクソノミーの “a”、“b”、“c” の値に割り当てられたページをレンダリングする際の並べ替えに適用されます。

また、’d’ カテゴリをレンダリングするときに 44 の重みが割り当てられています。

これにより、同じコンテンツが異なるタクソノミーの異なる位置に表示される可能性があります。

現在、タクソノミーは、コンテンツのデフォルトの順序付け (重み -> 日付) のみをサポートしています。

タクソノミーを使用する際に必要となるテンプレートは、 2 種類あります。

どちらのテンプレートも、テンプレート セクションで詳しく説明されています。 

リストテンプレート は、1 つの html ページで複数のコンテンツをレンダリングするために使用される、任意のテンプレートです。このテンプレートは、自動的に作成されるすべてのタクソノミーページを生成するために使用されます。

タクソノミー テンプレート は、指定されたテンプレートの用語のリストを生成するために使用されるテンプレートです。

リストテンプレート を使用して Hugo によって作成される自動タクソノミーページに加えて、タクソノミーでデータを表示する一般的な方法が以下の 4 つあります。

  1. 指定されたコンテンツについて、添付された用語を一覧表示できます
  2. 指定されたコンテンツについて、同じ用語を含む他のコンテンツを一覧表示できます。
  3. タクソノミーのすべての用語を一覧表示できます
  4. すべてのタクソノミーを (用語付きで) 一覧表示できます

ページに割り当てられた用語をリストする

.Page.GetTerms メソッドを使用して、ページに割り当てられた用語を一覧表示します。

順序なしリストをレンダリングするには、以下のようにします。

{{ $taxonomy := "tags" }}
{{ with .GetTerms $taxonomy }}
  <p>{{ (site.GetPage $taxonomy).LinkTitle }}:</p>
  <ul>
    {{ range . }}
      <li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
    {{ end }}
  </ul>
{{ end }}

カンマ区切りのリストを表示するには、以下のようにします。

{{ $taxonomy := "tags" }}
{{ with .GetTerms $taxonomy }}
  <p>
    {{ (site.GetPage $taxonomy).LinkTitle }}:
    {{ range $k, $_ := . -}}
      {{ if $k }}, {{ end }}
      <a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
    {{- end }}
  </p>
{{ end }}

タクソノミー用語が同じコンテンツを一覧表示する

一連の投稿のようなものにタクソノミーを使用している場合、同じタクソノミーに関連する個々のページを一覧表示できます。これは、関連するコンテンツを表示するための手っ取り早い方法でもあります。

例: 同じシリーズのコンテンツを表示する

<ul>
  {{ range .Site.Taxonomies.series.golang }}
    <li><a href="{{ .Page.RelPermalink }}">{{ .Page.Title }}</a></li>
  {{ end }}
</ul>

指定されたタクソノミーの全コンテンツを一覧表示する

これは、サイドバーで「注目のコンテンツ」として非常に便利です。コンテンツに異なる用語を割り当てることで、「注目のコンテンツ」の異なるセクションを作成することもできます。

<section id="menu">
  <ul>
    {{ range $key, $taxonomy := .Site.Taxonomies.featured }}
      <li>{{ $key }}</li>
      <ul>
        {{ range $taxonomy.Pages }}
          <li hugo-nav="{{ .RelPermalink }}"><a href="{{ .Permalink }}">{{ .LinkTitle }}</a></li>
        {{ end }}
      </ul>
    {{ end }}
  </ul>
</section>

サイトのタクソノミーをレンダリングする

サイトのタクソノミーのすべてのキーのリストを表示したい場合は、すべてのページで利用可能な .Site 変数 からそれらを取得できます。

これは、タグクラウド、メニュー、または単にリストといった形で表示されます。

以下の例では、サイトのタグ タクソノミーに含まれるすべての用語を表示します。

例: すべてのサイトタグを一覧表示する

<ul>
  {{ range .Site.Taxonomies.tags }}
    <li><a href="{{ .Page.Permalink }}">{{ .Page.Title }}</a> {{ .Count }}</li>
  {{ end }}
</ul>

例: すべてのタクソノミー、用語、および割り当てられたコンテンツを一覧表示する

この例では、すべてのタクソノミーとその用語、および各用語に割り当てられたすべてのコンテンツが一覧表示されます。

layouts/partials/all-taxonomies.html
<ul>
  {{ range $taxonomy, $terms := site.Taxonomies }}
    <li>
      {{ with site.GetPage $taxonomy }}
        <a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
      {{ end }}
      <ul>
        {{ range $term, $weightedPages := $terms }}
          <li>
            <a href="{{ .Page.RelPermalink }}">{{ .Page.LinkTitle }}</a>
            <ul>
              {{ range $weightedPages }}
                <li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
              {{ end }}
            </ul>
          </li>
        {{ end }}
      </ul>
    </li>
  {{ end }}
</ul>

タクソノミーのための .Site.GetPage

タクソノミーはリストなので、.GetPage関数 を使って、特定のタクソノミー用語に関連するすべてのページを簡潔な構文で取得できます。以下の例は、あなたのサイトのタグの全リストを網羅し、上記の 「すべてのサイトタグを一覧表示する」の例 のような脆弱な URL 構造を使用せずに、各用語の個々のタクソノミー ページにリンクしています。