背景

首页一般是读者进来之后看到最多的一个页面,我希望它能够承载一些长文、精选文章。希望首页的更新频率能够低一点,但是质量高一点。

那么 TIL(Today I Learned )栏目就不大适合放在首页了。因为其范围比较杂乱,内容有的长短不一,质量层次不齐。

那么本文章就讨论如何让 TIL Section 的文章不出现在整个站点的 RSS /inde.xml ,但不影响 TIL section 本身的 RSS 生成。

现有研究

PaperMod 主题讨论

我先搜索了一番 PaperMod 主题中有没有现成可用的配置。发现有相关讨论

https://github.com/search?q=repo:adityatelange/hugo-PaperMod+exclude+&type=discussions

其中一篇:Best way to exclude a group of posts from home page · adityatelange/hugo-PaperMod · Discussion #1188

提到可以给单篇文章设置 hiddenInHomeList: true 来让其不出现在首页。但是我希望一次性隐藏 TIL 的整个 Section。不符合需要。

具体做法是在文章的 md 文件的顶部添加 front matter

---
hiddenInHomeList: true
---

另一篇也提到可以通过自定义 layouts/_default/rss.xml 来覆盖主题的 rss 生成逻辑:

How do I create a new page so that it will not be included in RSS · adityatelange/hugo-PaperMod · Discussion #401

其他博客作者的讨论

Disable RSS for one (or more) specific posts in a blog - support - HUGO

我的方案

限定能出现在首页的分类

修改 config.yml 站点配置文件

params:
  mainSections:
    - posts

这样可以实现只让 section 设置为 posts 的文章展示在首页。但是不能阻止其出现在/index.xml 中,也就是整个站点的 rss 中。

要实现这个目的,需要修改 PaperMod 主题。

从首页的 RSS 中排除特定 Section

本方案需要复制 PaperMod 中负责 rss 生成的模板,放到工程根目录的 /layout/_default/rss.xml 中,然后对其进行做以下修改:

找到

{{- $pages := slice }}
{{- if or $.IsHome $.IsSection }}
{{- $pages = where $pctx.RegularPages "Section" "!=" "til" }}
{{- else }}
{{- $pages = $pctx.Pages }}
{{- end }}

改成:

{{- $pages := slice }}
{{- if or $.IsHome $.IsSection }}
{{- $pages = $pctx.RegularPages }}
{{- if $.IsHome }}
{{- $excludeSections := site.Params.rss.excludeSections | default slice }}
{{- $pages = where $pages "Section" "not in" $excludeSections }}
{{- end }}
{{- else }}
{{- $pages = $pctx.Pages }}
{{- end }}

修改 config.yml 站点配置文件,增加下面的条目

params:
  rss:
    excludeSections: ["til"]

总结

到这一步已经实现了文章开头想要实现的效果。这样操作后 /til/ 目录的文章就从首页以及首页的 rss 中消失了,但是不影响其他地方的 rss 和站点的 sitemap.xml 的生成。

作为一个 Hugo 主题,所有内容都可以由主题 + Hugo 内置的功能来实现,并且优先级是用户定义 > 主题定义 > Hugo 内置。因此当没有现成的配置可用,或者主题不支持的时候,可以通过在工程的 layout 中创建同名的文件来覆盖对应逻辑。这样的修改方式不会破坏主题的代码,也不需要 fork 出一份代码,非常优雅。

后续会不断地更新博客,将一些比较系统的长文放到首页,然后将偏向随便化的内容放到各自的 Section,读者可以直接感兴趣的标签或者分类。

例如: