Jekyll疑问:为何文章页无法循环调用同分类文章列表?
嘿,这个问题我之前帮人排查过好几次,核心其实是Jekyll在不同页面类型下的上下文变量差异——不是不能在文章页循环调用文章列表,而是你用的代码没适配文章页的场景~
先给你拆解两个页面的本质区别:
- 你的
categoryB/index.md是分类集合页(属于Jekyll的page类型,不是文章),你在这个页面里直接用site.categories.categoryB,是硬指定了分类名,自然能精准拿到该分类下的所有文章,循环正常运行。 - 而
article.md是单篇文章的布局,此时页面的上下文是当前的单篇文章(page变量指向的就是这篇文章本身),如果循环代码还是硬写死categoryB,就会出现匹配问题,导致循环失效。
下面给你列几个最常见的原因和解决方法:
1. 硬编码分类名,未适配文章的动态分类
如果你在分类页的循环是这种写法:
{% for post in site.categories.categoryB %} <li>{{ post.title }}</li> {% endfor %}
这种硬指定categoryB的方式在分类页没问题,但放到文章页里,只有当前文章刚好属于categoryB时才会生效;如果想让每篇文章页都自动显示自己所属分类的其他文章,得改成动态获取当前文章的分类:
{% assign current_category = page.categories[0] %} {% for post in site.categories[current_category] %} {% if post.url != page.url %} <!-- 排除当前文章本身,避免重复显示 --> <li><a href="{{ post.url }}">{{ post.title }}</a></li> {% endif %} {% endfor %}
注意:Jekyll里文章的categories是数组(一篇文章可以属于多个分类),所以用page.categories[0]取第一个分类;如果你的文章只会归属一个分类,这样就完全够用。
2. 分类名的大小写/格式不匹配
Jekyll的分类名是大小写敏感的!比如你文章的front matter里写的是categories: [CategoryB](首字母大写),但循环里写的是site.categories.categoryB(小写),就会找不到对应的分类集合,循环自然为空。
解决方法:要么统一所有分类名的大小写,要么用动态变量(比如上面的current_category)来获取,彻底避免硬编码的拼写错误。
3. 文章的分类字段设置错误
如果某篇文章的front matter里没写categories字段,或者写错成单数category,那page.categories就是空值,循环自然拿不到数据。
检查文章的front matter,确保是复数形式:
--- title: 我的示例文章 categories: [categoryB] # 必须是复数categories,不是单数category ---
最后再划个重点:完全可以在文章页循环调用同分类的文章列表,核心是要适配文章页的上下文,用动态变量获取当前文章的分类,而不是硬写死分类名~
内容的提问来源于stack exchange,提问作者Victor

