7 分钟阅读
https://gohugo.io/templates/taxonomy-templates/
Taxonomy(分类法)模板包括分类法列表页面、分类法条目页面以及在单页模板中使用分类法。
Hugo 支持用户定义的内容分组,称为分类法。分类法是展示内容之间逻辑关系的分类法方法。如果您对 Hugo 如何利用这个强大功能不熟悉,请参见内容管理下的分类法。
Hugo 提供了多种在项目模板中使用分类法的方式:
分类法列表页面模板是列表,因此具有可用于列表页面的所有变量和方法。
请参见模板查找。
请参见模板查找。
A Taxonomy is a map[string]WeightedPages
.
分类法是一个 map[string]WeightedPages
。
.Get(term)
返回条目的 WeightedPages。
.Count(term)
分配给该条目的内容数量。
.Alphabetical
Returns an OrderedTaxonomy (slice) ordered by Term.
返回一个按条目排序的 OrderedTaxonomy(切片)。
.ByCount
返回一个按条目数量排序的 OrderedTaxonomy(切片)。
.Reverse
返回一个按相反顺序排序的 OrderedTaxonomy(切片)。必须与 一个OrderedTaxonomy 一起使用。
由于 Map 是无序的,因此 OrderedTaxonomy 是一个具有定义顺序的特殊结构。
|
|
该切片的每个元素都有:
.Term
使用的条目。
.WeightedPages
一个加权页面的切片。
.Count
分配给该条目的内容数量。
.Pages
分配给该条目的所有页面。所有列表方法都可用于此。
WeightedPages是WeightedPage的一个切片。
|
|
.Count(term)
被分配到此条目的内容数量。
.Pages
返回一个页面的切片,可以使用任何 列表方法 进行排序。
如果您需要为每个分类法条目显示自定义元数据,您需要在/content/<TAXONOMY>/<TERM>/_index.md
路径下为该条目创建一个页面,并在其前置元数据中添加元数据,如分类法文档中所述。以其中显示的演员分类法为例,在您的分类法条目模板中,您可以通过迭代变量.Pages
来访问您的自定义字段:
|
|
分类法可以按字母键或分配给该键的内容数量排序。
|
|
Hugo在分类法中使用date
和weight
来排序内容。
在 Hugo 中,每篇内容可以选择性地被分配一个日期。它也可以为每个所属分类法分配一个权重。
当在分类法中迭代内容时,默认排序方式与用于章节和列表页面相同:首先按权重,然后按日期排序。这意味着,如果两篇内容的权重相同,则最近日期的内容将首先显示。
任何一篇内容的默认权重为0。零意味着"does not have a weight",而不是"has a weight of numerical value zero"。
因此,权重为零的条目被特殊处理:如果两个页面的权重不相等,并且其中一个是零,则具有零权重的页面将始终出现在另一个页面之后,而不用考虑另一个页面的权重。因此,应谨慎使用零权重:例如,如果正权重和负权重都用于在两个方向上扩展序列,则具有零权重的页面将不会出现在列表的中间,而是在末尾。
每个内容可以分别为它所属的每个分类法(taxonomies)赋予一个权重(weight)。
content/example.md
=== “yaml”
``` yaml
---
categories:
- d
categories_weight: 44
tags:
- a
- b
- c
tags_weight: 22
title: Example
---
```
=== “toml”
``` toml
+++
categories = ['d']
categories_weight = 44
tags = ['a', 'b', 'c']
tags_weight = 22
title = 'Example'
+++
```
=== “json”
``` json
{
"categories": [
"d"
],
"categories_weight": 44,
"tags": [
"a",
"b",
"c"
],
"tags_weight": 22,
"title": "Example"
}
```
惯例是使用taxonomyname_weight
。
在上面的例子中,这篇内容在渲染分配给"tag" 分类法中的"a"、“b” 和 “c” 值的页面时具有22的权重。
在渲染’d’类别时,它还被赋予了44的权重。
这样做可以使同一篇内容在不同的分类法中出现在不同的位置。
目前,分类法仅支持默认的内容排序方式,即权重->日期。
使用分类法将需要提供两种不同的模板。
这两中模板在模板章节中都有详细介绍。
列表模板是用于在单个HTML页面中渲染多篇内容的任一模板。此模板将用于生成所有自动创建的分类法页面。
分类法模板是用于生成给定模板的条目列表的模板。
除了使用 Hugo 自动生成的 列表模板 来创建分类法页面外,还有四种常见的方式可以展示您的分类法数据:
在内容模板中,您可能希望显示分配给该内容的分类法。
由于我们利用前置元数据系统为内容定义分类法,因此分配给每篇内容的分类法位于通常的位置(即 .Params.<TAXONOMYPLURAL>
)。
|
|
如果您想要内联列出分类法,您将需要注意标题中的可选复数结尾(如果有多个分类法),以及逗号。假设我们有一个名为 “directors” 的分类法,如 TOML 格式的前置元数据所示:directors: [ "Joel Coen", "Ethan Coen" ]
。
要列出这样的分类法,请使用以下方法:
|
|
或者,如果只需要使用分隔符列出分类法,则可以使用delimit 模板函数作为快捷方式。详见GitHub上的#2143讨论。
如果您正在使用分类法来管理一系列文章,您可以列出与同一分类法相关联的各个页面。这也是一种快速粗略的方法来展示相关内容:
|
|
这在侧边栏中作为"特色内容"将非常有用。您甚至可以通过为内容分配不同的条目来创建不同的"特色内容" 章节。
|
|
如果您希望显示站点分类法的所有键列表,可以从每个页面都可以访问的.Site
变量中检索它们。
这可以采用标签云、菜单或简单列表的形式。
以下示例显示站点标签分类法中的所有条目:
|
|
这个示例将列出所有分类法及其条目,以及分配给每个条目的所有内容。
layouts/partials/all-taxonomies.html
|
|
.Site.GetPage
用于分类法 由于分类法是列表,可以使用.GetPage
函数使用简洁的语法获取与特定分类法条目相关联的所有页面。下面对站点上所有标签进行全面的遍历,并链接到每个条目的单独分类页面,而不必使用上面的"列出所有站点标签"示例中更脆弱的URL构建方法:
links-to-all-tags.html
|
|