Jekyll按主题分类存放文章并生成对应站点目录的方法
解决Jekyll按主题分类生成独立目录并适配导航的方案
一、用自定义集合(Collections)实现分类目录
Jekyll的自定义集合可以让你按主题管理文章,并生成对应独立目录,具体操作:
- 修改
_config.yml添加集合配置
在配置文件末尾添加以下内容,开启travel和work两个集合,并设置生成输出:
collections: travel: output: true permalink: /:collection/:title/ # 自定义文章路径格式,可选 work: output: true permalink: /:collection/:title/
output: true是核心设置,确保Jekyll为该集合生成独立的静态文件目录permalink定义文章URL结构,这里设置为/分类名/文章标题/,对应_site/travel/和_site/work/目录
创建对应集合文件夹
在项目根目录下新建_travel和_work文件夹,将对应主题的文章放入其中。文章命名可沿用_posts的YYYY-MM-DD-标题.md格式,也可直接使用标题.md,按需选择。文章Front Matter设置
集合内的文章保留基础Front Matter即可,示例:
--- layout: post # 使用你现有文章的布局模板 title: "我的旅行日记" date: 2024-05-20 ---
二、适配你的路径导航代码
现在文章URL会变成/travel/我的旅行日记/或/work/工作总结/,拆分后的paths数组会包含travel或work,只需做两处调整:
- 在语言配置文件中添加分类名翻译
找到site.data.locales[site.lang].tabs对应的配置文件(如_data/locales/zh.yml),添加分类对应的文本:
tabs: home: 首页 travel: 旅行 work: 工作 # 保留原有tab项
- 修复导航代码的语法问题并优化
原代码中{% elsif %}缺少判断条件,改为{% else %},同时过滤URL拆分后可能出现的空字符串:
{% assign paths = page.url | split: '/' %} {% for item in paths %} {% if forloop.first %} <span> <a href="{{ '/' | relative_url }}"> {{ site.data.locales[site.lang].tabs.home | capitalize }} </a> </span> {% elsif forloop.last %} {% if page.collection == 'tabs' %} <span>{{ site.data.locales[site.lang].tabs[item] | default: page.title }}</span> {% else %} <span>{{ page.title }}</span> {% endif %} {% else %} {% if item != "" %} <!-- 过滤URL开头的空字符串 --> <span> <a href="{{ '/' | append: item | relative_url }}"> {{ site.data.locales[site.lang].tabs[item] | default: item }} </a> </span> {% endif %} {% endif %} {% endfor %}
三、验证效果
运行bundle exec jekyll serve,访问旅行文章时导航会显示首页 > 旅行 > 我的旅行日记,工作文章则显示首页 > 工作 > 工作总结,对应静态文件会分别生成在_site/travel/和_site/work/目录下。
内容的提问来源于stack exchange,提问作者Xudong
相关产品推荐
相关产品推荐

