
本文介绍如何通过 Hugo 的分类法(Taxonomy)机制,为博客文章构建类似 /2016/、/2016/12/ 的归档页面,使读者可直接访问指定年份或月份的文章列表。
本文介绍如何通过 hugo 的分类法(taxonomy)机制,为博客文章构建类似 `/2016/`、`/2016/12/` 的归档页面,使读者可直接访问指定年份或月份的文章列表。
Hugo 原生不支持基于 URL 路径(如 /year/month/)自动渲染归档列表页,但可通过巧妙结合 自定义分类法(Taxonomy) 与 分组模板(_index.md + taxonomy.html) 实现这一目标。核心思路是:将年份(如 2016)设为一个分类(year),再将每月文章归入对应年份分类,并利用 Hugo 的分类列表页能力生成 /year/ 页面;进一步地,借助 .Pages.GroupByDate "2006/01" 在模板中按月二次分组,即可渲染出 /2016/12/ 这样的子归档视图。
✅ 步骤一:启用并配置 year 分类法
在 config.toml(或 config.yaml)中添加:
[taxonomies] year = "years"
⚠️ 注意:
year = "years"表示分类法名称为year,其内容项(terms)将存储在content/years/下(实际无需手动创建该目录,Hugo 自动管理)。
✅ 步骤二:为每篇文章注入年份分类
在每篇 Markdown 文章的 front matter 中显式声明所属年份,例如 content/post/coding/html/my-post.md:
--- title: "My Post" date: 2016-12-15T10:30:00+08:00 years: ["2016"] # ← 关键:将文章加入 "2016" 这个 year 分类项 ---
Hugo 会自动为每个 years 值(如 "2016")生成独立的分类列表页:/years/2016/。
✅ 步骤三:重写分类列表模板,支持按月分组
在 layouts/taxonomy/year.terms.html(或 layouts/taxonomy/list.html,若统一复用)中,使用 .Data.Pages.GroupByDate 按月组织文章:
<!-- layouts/taxonomy/year.terms.html -->
{{ define "main" }}
<h1>Posts from {{ .Title }}</h1>
{{ $pages := .Data.Pages }}
{{ with $pages.GroupByDate "2006/01" }}
{{ range . }}
<h2>{{ .Key }} ({{ len .Pages }} posts)</h2>
<ul>
{{ range .Pages }}
<li>
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
<small>{{ .Date.Format "Jan 02, 2006" }}</small>
</li>
{{ end }}
</ul>
{{ end }}
{{ else }}
<p>No posts found for this year.</p>
{{ end }}
{{ end }}此时访问 http://localhost:1313/years/2016/ 即可看到按 2016/12、2016/01 等分组的文章列表。
✅ 步骤四(可选):重定向路径至更简洁的 /2016/
若希望 URL 为 /2016/ 而非 /years/2016/,可通过以下任一方式实现:
-
方法 A:使用别名(Aliases)
在content/years/2016/_index.md(需手动创建)中添加:--- title: "2016" aliases: ["/2016/"] ---
✅ 简单可靠,Hugo 自动处理 301 重定向(开发服务器需启用
--enableGitInfo或确保 Hugo ≥ 0.115)。 方法 B:自定义输出格式(高级)
配置outputFormats和permalinks,但复杂度高,一般推荐方法 A。
? 注意事项与最佳实践
- 所有归档页默认支持 Hugo 内置分页(
{{ .Paginator }}),可在模板中添加翻页导航; - 若需
/2016/12/独立 URL(而非仅作为分组标题),需配合 Hugo 的 Section 页面 或 自定义输出格式 实现,但会显著增加复杂度;当前方案已满足“访问/2016/查看全年文章,页面内点击月份跳转到锚点或筛选”的主流需求; - 确保
date字段准确且存在于所有文章中,否则分组可能异常; - 开发时建议开启
hugo server --disableFastRender,确保分类变更实时生效。
通过上述配置,你无需插件或外部脚本,即可用 Hugo 原生能力构建专业、SEO 友好的时间归档体系——简洁、可维护,且完全静态化。

















