hugo/docs/content/en/methods/site/Taxonomies.md
2024-08-09 15:17:43 +02:00

4.5 KiB

title description categories keywords action
Taxonomies Returns a data structure containing the site's Taxonomy objects, the terms within each Taxonomy object, and the pages to which the terms are assigned.
related returnType signatures
page.TaxonomyList
SITE.Taxonomies

Conceptually, the Taxonomies method on a Site object returns a data structure such as:

{{< code-toggle >}} taxonomy a:

  • term 1:
    • page 1
    • page 2
  • term 2:
    • page 1 taxonomy b:
  • term 1:
    • page 2
  • term 2:
    • page 1
    • page 2 {{< /code-toggle >}}

For example, on a book review site you might create two taxonomies; one for genres and another for authors.

With this site configuration:

{{< code-toggle file=hugo >}} taxonomies genre = 'genres' author = 'authors' {{< /code-toggle >}}

And this content structure:

content/
├── books/
│   ├── and-then-there-were-none.md --> genres: suspense
│   ├── death-on-the-nile.md        --> genres: suspense
│   └── jamaica-inn.md              --> genres: suspense, romance
│   └── pride-and-prejudice.md      --> genres: romance
└── _index.md

Conceptually, the taxonomies data structure looks like:

{{< code-toggle >}} genres:

  • suspense:
    • And Then There Were None
    • Death on the Nile
    • Jamaica Inn
  • romance:
    • Jamaica Inn
    • Pride and Prejudice authors:
  • achristie:
    • And Then There Were None
    • Death on the Nile
  • ddmaurier:
    • Jamaica Inn
  • jausten:
    • Pride and Prejudice {{< /code-toggle >}}

To list the "suspense" books:

<ul>
  {{ range .Site.Taxonomies.genres.suspense }}
    <li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
  {{ end }}
</ul>

Hugo renders this to:

<ul>
  <li><a href="/books/and-then-there-were-none/">And Then There Were None</a></li>
  <li><a href="/books/death-on-the-nile/">Death on the Nile</a></li>
  <li><a href="/books/jamaica-inn/">Jamaica Inn</a></li>
</ul>

{{% note %}} Hugo's taxonomy system is powerful, allowing you to classify content and create relationships between pages.

Please see the taxonomies section for a complete explanation and examples.

{{% /note %}}

Examples

List content with the same taxonomy term

If you are using a taxonomy for something like a series of posts, you can list individual pages associated with the same term. For example:

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

List all content in a given taxonomy

This would be very useful in a sidebar as “featured content”. You could even have different sections of “featured content” by assigning different terms to the content.

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

Render a site's taxonomies

The following example displays all terms in a site's tags taxonomy:

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

This example will list all taxonomies and their terms, as well as all the content assigned to each of the terms.

{{< code file=layouts/partials/all-taxonomies.html >}} {{ with .Site.Taxonomies }} {{ $numberOfTerms := 0 }} {{ range $taxonomy, $terms := . }} {{ $numberOfTerms = len . | add $numberOfTerms }} {{ end }}

{{ if gt $numberOfTerms 0 }}

    {{ range $taxonomy, $terms := . }} {{ with $terms }}
  • {{ .Page.LinkTitle }}
      {{ range $term, $weightedPages := . }}
    • {{ .Page.LinkTitle }}
        {{ range $weightedPages }}
      • {{ .LinkTitle }}
      • {{ end }}
    • {{ end }}
  • {{ end }} {{ end }}
{{ end }} {{ end }} {{< /code >}}