Списки таксономии Hugo
←Hugo
Например, есть словарь categories, заданный в config.toml так:
[taxonomies]
category = "categories"
Важно различать единственную и множественную форму названия словаря. В примерах дальше они выделены полужирным.
Словари нужно специально прописывать в config.toml, а термины, относящиеся к словарям, не нужно. Для создания термина достаточно упомянуть его в коде конечной страницы во frontmatter.
Например, чтобы отнести страницу к термину Building в словаре categories, просто пропишите в странице:
---
categories:
- Building
---
При этом сразу будет создана страница термина http://localhost:1313/categories/building/
Чтобы увидеть список всех терминов, относящихся к словарю category, нужно открыть страницу словаря http://localhost:1313/categories/
Для этой страницы будет использован самый подходящий шаблон из существующих файлов (сверху — наиболее подходящие):
layouts/categories/category.terms.html
layouts/categories/terms.html
layouts/categories/list.html
layouts/taxonomy/category.terms.html
layouts/taxonomy/terms.html
layouts/taxonomy/list.html
layouts/category/category.terms.html
layouts/category/terms.html
layouts/category/list.html
layouts/_default/category.terms.html # список терминов словаря 'category'
layouts/_default/terms.html # список терминов на страницах словарей
layouts/_default/list.html # самый базовый шаблон, общий для всех списков контента
Более полный список порядка шаблонов: Examples: Layout Lookup for Taxonomy Terms Pages
В шаблоне нужно разместить следующий код.
{{ range .Pages }}
<p><a href="{{ .Permalink }}">{{ .Title }}</a></p>
{{ end }}
Если для термина создана страница типа content/categories/building/_index.ru.md, то в качестве названия термина будет взят title из frontmatter страницы.
URL ссылки также может быть изменен в поле url во frontmatter страницы.
{{ range .Pages }}
<p>
<a href="{{ .Permalink }}">{{ .Title }}</a>
{{ with .Params.description }}
<br><small>{{ . }}</small>
{{ end }}
</p>
{{ end }}
Сортировка по алфавиту по названиям терминов:
{{ range .Data.Terms.Alphabetical }}
<p><a href="{{ .Page.Permalink }}">{{ .Page.Title }}</a> ({{ .Term }})</p>
{{ end }}
Сортировка будет не по .Page.Title, а по .Term.
Обратная сортировка: .Data.Terms.Alphabetical.Reverse
Сортировка по алфавиту по названиям терминов в страницах терминов:
{{ range .Pages.ByTitle }}
<p><a href="{{ .Permalink }}">{{ .Title }}</a></p>
{{ end }}
Обратная сортировка: .Pages.ByTitle.Reverse
Сортировка по количеству страниц в каждом термине:
{{ range .Data.Terms.ByCount }}
<p><a href="{{ .Page.Permalink }}">{{ .Page.Title }}</a> ({{ .Count }})</p>
{{ end }}
Обратная сортировка: .Data.Terms.ByCount.Reverse
Сортировка по дате:
{{ range .Data.Pages.ByDate }}
<p><a href="{{ .Permalink }}">{{ .Title }}</a> ({{ .Date | dateFormat "2006-01-02" }})</p>
{{ end }}
Обратная сортировка: .Data.Pages.ByDate.Reverse
<div class="columns is-mobile is-multiline">
{{ range .Data.Terms.ByCount }}
<div class="column is-half-mobile is-one-third-tablet is-one-quarter-desktop is-one-fifth-widescreen">
<div class="card">
<div class="card-image">
<a href="{{ .Page.Permalink }}">
<figure class="image is-3by2">
{{ $firstChild := index .Pages 0 }}
{{ with $firstChild.Params.images }}
<img src="{{ index . 0 }}" alt="">
{{ end }}
</figure>
</a>
</div>
<div class="card-content has-text-centered">
<div>
<a class="title is-5 is-size-6-mobile" href="{{ .Page.Permalink }}">{{ .Page.Title }}</a>
{{ $pageCount := len .Pages }}
<p>{{ $pageCount }} post{{ if ne $pageCount 1 }}s{{ end }} </p>
</div>
</div>
</div>
</div>
{{ end }}
</div>
{{ range .Data.Terms.ByCount }}
<li>
<a href="{{ .Page.Permalink }}">{{ .Page.Title }}</a>
{{ with $.Site.GetPage "taxonomy" .Term }}
{{ if .Params.icon }}
<img src="{{ .Params.icon }}" alt="{{ .Page.Title }}">
{{ end }}
{{ end }}
</li>
{{ end }}
Чтобы увидеть список всех страниц сайта, относящихся к термину Building словаря category, нужно открыть страницу http://localhost:1313/categories/building/
Для этой страницы будет использован самый подходящий шаблон из существующих файлов (сверху — наиболее подходящие):
layouts/categories/category.html
layouts/categories/taxonomy.html
layouts/categories/list.html
layouts/taxonomy/category.html
layouts/taxonomy/taxonomy.html
layouts/taxonomy/list.html
layouts/category/category.html
layouts/category/taxonomy.html
layouts/category/list.html
layouts/_default/category.html # список материалов словаря 'category'
layouts/_default/taxonomy.html # список материалов на страницах таксономии
layouts/_default/list.html # самый базовый шаблон, общий для всех списков контента
Еще более полный список порядка шаблонов: Examples: Layout Lookup for Taxonomy List Pages
В шаблоне нужно разместить следующий код.
{{ range .Data.Pages }}
<p><a href="{{ .Permalink}}">{{ .Title }}</a></p>
{{ end }}
Выведем все термины словаря categories:
{{ range $cat, $tax := .Site.Taxonomies.categories }}
<li><a href="/categories/{{ $cat | urlize }}/">{{ replace $cat "-" " " | title }}</a> </li>
{{ end }}
Выведем все материалы термина art в словаре clients:
{{ range .Site.Taxonomies.clients.art }}
<li><a href="{{ .Page.Permalink }}">{{ .Page.Title }}</a></li>
{{ end }}
То же самое, но только 5 штук и с сортировкой по полю order:
{{ $term := "art" }}
{{ $taxonomy := index .Site.Taxonomies.clients $term }}
{{ range first 5 (sort $taxonomy.Pages "Params.order" "desc") }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
{{ $data := .Data }}
{{ range $key,$value := .Data.Terms.ByCount }}
<h2><a href="{{ $data.Plural }}/{{ $value.Name | urlize }}/">{{ replace $value.Name "-" " " | title }}</a> ({{ $value.Count }})</h2>
<ol>
{{ range $value.Pages.ByDate }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
</ol>
{{ end }}
Выведем число страниц сайта, относящихся к термину art словаря categories:
{{ .Site.Taxonomies.categories.art.Count }}