个人博客hugo Taxonomy
Taxonomy,即分类,是Hugo中一个很有用的页面管理功能。 本文基于Hyde这个Theme,介绍如何在Hugo中定制、使用Taxonomy。
Hugo中的Taxonomy概念
Hugo includes support for user-defined groupings of content called taxonomies. Taxonomies are classifications of logical relationships between content.
在官方文档中,简单介绍了Taxonomy的相关概念。 这里有三级概念,见下表。
概念 | 翻译 | 解释 |
---|---|---|
Taxonomy | 分类 | 用来归类的大类,比如tag。 |
term | 项 | 可以认为是Taxonomy的值,比如hugo。 |
Value | 值 | 被归类为某个term的内容,比如tag为hugo的页面。 |
Content | 内容 | 与Value同义。 |
以下是官方给出的例子,关于演员与电影。
Actor <- Taxonomy
Bruce Willis <- Term
The Sixth Sense <- Content
Unbreakable <- Content
Moonrise Kingdom <- Content
Samuel L. Jackson <- Term
Unbreakable <- Content
The Avengers <- Content
xXx <- Content
默认Taxonomy
Hugo 支持两个 Taxonomy :tag和category。 如果是电影类网站,Taxonomy可以有导演、演员、编剧等。 但是对于一个个人博客类网站来说,只需要一个tag就够了。
除此之外,Hugo默认还有Section的概念。 所有文章都在content目录下,而Section就是文章所在的content子目录。 Section也是URL上的一部分。
Section与Taxonomy的区别是,一个Single页面只能属于一个Section,而却可以属于多个Taxonomy的不同term。 所以,Taxonomy比Section更灵活。
官方的示例配置如下,定义了三个Taxonomy的term。
[taxonomies]
tag = "tags"
category = "categories"
series = "series"
这里写几个,就是几个Taxonomy。 如果不写[taxonomies]这一个代码块,就是使用默认的tag和category两个。
其中,等号前面的tag代表真正的term名称,而后面的"tags"则代表使用时的名称。 通常,前面用名词的单数,后面用名词的复数。 在Taxonomy的列表页面中,以tags为URL的一部分; 在Front Matter中,也使用tags = []来指定当前页面所属的tag。
+++
title = "Hugo: A fast and flexible static site generator"
tags = [ "Development", "Go", "fast", "Blogging" ]
categories = [ "Development" ]
series = [ "Go Web Dev" ]
+++
对博客类网站来说,如果每个页面都要写tags、categories、series,想想也是很辛苦。 所以本站还是坚持极简的设计,一个tags足以。
Taxonomy的展示页面
Taxonomy有两种展示页面,对应两种模板文件。
在使用之初,由于概念不清,被坑很惨。 做了半天,相关页面却纹丝不动。 因此觉得,定制Taxonomy页面,应该在理清概念的基础上,选定正确的模板文件,再开始定制。
Taxonomy List Templates
这是普通的列表页面,URL示例为/tags/hugo/。 由于这是普通的列表页面,所以默认情况下会使用列表模板。
对于本站,这个页面没有定制的必要,和Section一样,使用默认列表模板即可。 而如果有定制需求,则需要按照以下优先级去修改。
/layouts/taxonomy/<SINGULAR>.html
/layouts/_default/taxonomy.html
/layouts/_default/list.html
/themes/<THEME>/layouts/taxonomy/<SINGULAR>.html
/themes/<THEME>/layouts/_default/taxonomy.html
/themes/<THEME>/layouts/_default/list.html
这是Taxonomy特有的列表页面,URL示例为/tags/。 显然,/tags/hugo/是所有tag为hugo的页面,而/tags/则是需要显示所有tag。 这个页面与普通的列表页面有巨大差异,因为默认是没有任何页面属于这个页面的,所以不使用默认列表模板。 如果需要展示,就需要按照以上优先级去定制。 如果按/tags/来算,第1个模板是/layouts/taxonomy/tag.terms.html。 由于本站仅仅使用了tag作为Taxonomy,所以就直接定制了第2个页面。 以下即是本站(2017年10月)的/layouts/_default/terms.html模板的部分内容,以供参考。 页面示例,可以访问/tags/。 (当然,鉴于本站经常更新,页面示例可能会有所修改。) 其中用到的函数、变量,需要去相关页面查阅。
Taxonomy Terms Template/layouts/taxonomy/<SINGULAR>.terms.html
/layouts/_default/terms.html
/themes/<THEME>/layouts/taxonomy/<SINGULAR>.terms.html
/themes/<THEME>/layouts/_default/terms.html
Term模板代码示例<h1>分类标签有{{ len .Data.Terms }}个</h1>
{{ $data := .Data }}
{{ range .Data.Terms.ByCount }}
{{ $termLink := printf "/%s/%s/" $data.Plural .Term | urlize }}
<h2>
<a href="{{ $termLink }}">{{ .Term }}</a>
有{{ .Count }}篇
</h2>
<ul>
{{ range .Pages | first 5 }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
{{ if gt (len .Pages) 5 }}
<li><a href="{{ $termLink }}">……</a></li>
{{ end }}
</ul>
{{ end }}
参考Hugo | Taxonomies
Hugo | Taxonomy Variables
Hugo | Taxonomy Templates
Hugo | Functions Quick Reference