背景
首页一般是读者进来之后看到最多的一个页面,我希望它能够承载一些长文、精选文章。希望首页的更新频率能够低一点,但是质量高一点。
那么 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 生成逻辑:
其他博客作者的讨论
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,读者可以直接感兴趣的标签或者分类。
例如:
- Emacs: Link