Hugo分类排序:自定义Front Matter变量访问返回null的问题排查
解决Hugo分类页面无法获取自定义Front Matter变量
root的问题 首先明确:你遇到的$.Params.root返回null的问题,不是因为分类没有详情页,而是上下文匹配错误导致的。下面分两种场景帮你针对性解决:
场景1:给整个分类列表页设置全局root变量
如果你想给/categories/这个总列表页设置统一的root值,需要把变量定义在分类列表页对应的Front Matter文件里:
- 在你的
content目录下创建/编辑content/categories/_index.md(注意是_index.md,不是普通的md文件),添加Front Matter:
--- title: "所有分类" root: "你的一级目录名称" # 这里填你想要的一级目录值 ---
- 此时你模板里外层的
{{ $root := .Params.root}}就能正确获取到这个值了,因为当前上下文是分类列表页,对应_index.md里的参数。
场景2:给单个分类设置独立的root变量
如果你的需求是每个子分类(比如「技术」「生活」这些分类)都有自己的root值,那需要把变量定义在单个分类的详情页文件里:
- 给每个分类创建对应的详情页文件,比如
content/categories/tech.md、content/categories/life.md,在每个文件的Front Matter里添加root:
--- title: "技术分类" root: "知识分享" # 该分类对应的一级目录 ---
- 修改你的模板代码,在单个分类的上下文里访问
root变量——也就是在{{ with $.Site.GetPage "taxonomy" (printf "%s/%s" $type $term) }}这个代码块内,用.Params.root获取:
{{ partial "head.html" . }} {{ partial "header.html" . }} {{ $termName := .Data.Plural }} {{ $terms := .Data.Terms.ByCount }} {{ $length := len $terms }} {{ $type := .Type }} <!-- Categories Page --> <div class="post {{.Data.Plural}}"> {{ if and $.Site.Taxonomies.categories (eq $termName "categories") }} <div class="categories-card"> {{ range $terms }} {{ $term := .Term }} {{ $pages := .Pages }} {{ with $.Site.GetPage "taxonomy" (printf "%s/%s" $type $term) }} <div class="card-item"> <!-- 在这里访问单个分类的root变量 --> <p>{{ .Params.root }}</p> <div class="categories" > <a href="{{ .URL }}"><h3> <i class="fas fa-folder" style="padding-right: 3px"></i> {{ $term | humanize }} </h3> </a> {{ range first 5 $pages }} <article class="archive-item"> <a href="{{ .URL }}" class="archive-item-link">{{ .Title }}</a> </article> {{ end }} {{ if gt (len $pages) 5 }} <span class="more-post"> <a href="{{ .Permalink }}" class="more-post-link">More >></a> </span> {{ end }} </div> </div> {{ end }} {{ end }} </div> <!-- //categories-card --> <!-- Tag cloud Page --> {{ else if and $.Site.Taxonomies.tags (eq $termName "tags") }} <div class="tag-cloud-tags"> {{ range $.Site.Taxonomies.tags.ByCount }} {{ if .Name }} <a href="/tags/{{ .Name | urlize}}/"> {{ .Name }} <small>({{ .Count }})</small></a> {{ end }} {{end}} </div> {{ end }} </div> </div> {{ partial "footer.html" . }} {{ partial "analytics.html" . }}
关键知识点补充
- Hugo的Taxonomy页面分为两种:
- Taxonomy List Page:所有分类/标签的总列表页,对应
content/[taxonomy]/_index.md,模板里的上下文对应该页面的参数。 - Taxonomy Term Page:单个分类/标签的详情页,对应
content/[taxonomy]/[term].md,模板里的上下文对应该单个分类的参数。
- Taxonomy List Page:所有分类/标签的总列表页,对应
- 你之前的错误核心是:要么没把参数放在对应页面的Front Matter里,要么在Taxonomy List的上下文里错误地试图获取单个Term的参数。
内容的提问来源于stack exchange,提问作者little_white
相关产品推荐
相关产品推荐

