Jekyll站点如何获取所有页面自定义topic元数据的取值列表
Jekyll 全站topic元数据取值列表实现方案
无插件方案(兼容GitHub Pages)
直接在Liquid模板中遍历全站所有内容,收集topic值后去重即可,无需额外配置,适合用GitHub Pages托管站点的场景。
示例代码如下:
{% comment %} 初始化空数组存储所有topic {% endcomment %} {% assign all_topics = "" | split: "" %} {% comment %} 遍历所有文章提取topic {% endcomment %} {% for post in site.posts %} {% if post.topic and post.topic != "" %} {% assign all_topics = all_topics | push: post.topic %} {% endif %} {% endfor %} {% comment %} 遍历所有自定义页面提取topic {% endcomment %} {% for page in site.pages %} {% if page.topic and page.topic != "" %} {% assign all_topics = all_topics | push: page.topic %} {% endif %} {% endfor %} {% comment %} 如果用到了自定义集合,补充对应遍历逻辑即可,示例为名为docs的集合 {% endcomment %} {% for doc in site.docs %} {% if doc.topic and doc.topic != "" %} {% assign all_topics = all_topics | push: doc.topic %} {% endif %} {% endfor %} {% comment %} 去重并排序,得到最终不重复的topic列表 {% endcomment %} {% assign unique_topics = all_topics | uniq | sort %}
拿到unique_topics数组后直接遍历即可做分类展示:
{% for topic in unique_topics %} <h2>{{ topic }}</h2> <!-- 此处插入你已实现的、对应topic的页面筛选逻辑 --> {% endfor %}
插件方案(仅支持自行构建Jekyll站点的场景)
如果站点是自行构建部署、支持自定义插件,可以把topic收集逻辑封装为插件,直接在全局变量中调用,无需在模板中重复写遍历逻辑。
- 在站点根目录新建
_plugins/topics_generator.rb文件,写入以下代码:
Jekyll::Hooks.register :site, :post_read do |site| all_topics = [] # 自动遍历所有内容类型(文章、页面、自定义集合)收集topic [site.posts.docs, site.pages, site.collections.values.map(&:docs).flatten].flatten.each do |item| next unless item.data['topic'] && !item.data['topic'].empty? all_topics << item.data['topic'] end # 去重排序后存入site全局配置 site.config['all_topics'] = all_topics.uniq.sort end
- 模板中直接调用全局变量即可:
{% for topic in site.all_topics %} <!-- 分类展示逻辑 --> {% endfor %}
内容的提问来源于stack exchange,提问作者jlconlin
相关产品推荐
相关产品推荐

