咨询Jekyll自定义文件名实现及标签动态生成页面的方法
嘿,这个需求在Jekyll里完全能搞定!你说的基于标签自动生成对应页面的功能,在Jekyll圈子里一般叫标签归档页生成,本质是利用Jekyll的模板系统和内置的站点数据来实现动态页面输出。下面分两部分给你讲清楚:
当然可以!Jekyll允许你通过文章Front Matter里的permalink字段,直接指定单篇文章最终生成的路径(也就是自定义文件名)。比如你在posts/somepost.md里这么写:
--- name: Some Post tags: ["tag_a", "tag_b"] permalink: /my-custom-folder/tagged-post.html ---
编译后就会生成my-custom-folder/tagged-post.html这个文件,路径完全由你控制。如果想批量统一设置所有文章的路径规则,也可以在_config.yml里配置全局的permalink,比如:
permalink: /posts/:year/:month/:title/
这样所有文章都会按照「年/月/标题」的路径生成,但单篇文章里的permalink会优先覆盖全局规则,灵活性拉满。
这部分分两种场景,看你是手动维护少量标签,还是需要自动处理大量动态新增的标签:
场景1:标签数量少,手动维护
这种情况最简单,直接给每个标签创建单独的页面文件即可:
- 先写一个标签页面的模板,比如在
_layouts/tag.html里:
--- layout: default # 替换成你自己的默认布局 --- <h1>标签:{{ page.tag }}</h1> <!-- 列出所有带这个标签的文章 --> <ul class="post-list"> {% for post in site.posts %} {% if post.tags contains page.tag %} <li> <a href="{{ post.url }}">{{ post.name }}</a> <time>{{ post.date | date: "%Y-%m-%d" }}</time> <p>{{ post.excerpt | strip_html | truncatewords: 25 }}</p> </li> {% endif %} {% endfor %} </ul>
- 在
tags/目录下创建对应标签的md文件,比如tags/tag_a.md:
--- layout: tag tag: tag_a permalink: /tags/tag_a.html ---
tags/tag_b.md同理,Jekyll编译时会自动用模板渲染出对应的tags/tag_a.html和tags/tag_b.html页面。
场景2:标签多或动态新增,自动生成
如果标签经常新增,手动创建文件太麻烦,可以用Jekyll的生成器插件来自动遍历所有标签并生成页面:
- 先创建刚才的
_layouts/tag.html模板(和场景1里的一样就行)。 - 在项目根目录下新建
_plugins/tag_generator.rb文件,写入以下Ruby代码:
module Jekyll class TagPageGenerator < Generator safe true def generate(site) # 遍历所有站点标签 site.tags.each do |tag, posts| # 为每个标签创建一个页面 site.pages << TagPage.new(site, site.source, tag, posts) end end end class TagPage < Page def initialize(site, base, tag, posts) @site = site @base = base @dir = "tags" # 页面生成的目录 @name = "#{tag}.html" # 页面文件名 self.process(@name) # 处理文件名 # 加载标签页面模板 self.read_yaml(File.join(base, "_layouts"), "tag.html") # 给模板传递标签变量 self.data["tag"] = tag self.data["title"] = "标签:#{tag}" end end end
- 启动Jekyll编译时,这个插件会自动读取
site.tags里的所有标签,为每个标签生成tags/tag_name.html页面,完全不用手动创建文件。
注意:如果你是用GitHub Pages托管站点,自定义Ruby插件是不被支持的,这时候可以改用Jekyll的Collections功能:
在_config.yml里添加:collections: tags: output: true permalink: /tags/:name.html然后在
_tags/目录下创建每个标签的md文件(和场景1类似),虽然还是手动创建,但可以统一管理标签的额外信息(比如标签描述),而且路径会自动按照配置生成。
内容的提问来源于stack exchange,提问作者Bob van Luijt

