如何在11ty中全局实现标签分类下文章按字母顺序排序
解决方案:全局配置+标签模板联动实现需求
你当前的问题核心在于,postsAscending集合是把所有符合路径的文章全部聚合后排序,所以不管哪个标签页面调用它,都会输出所有文章。要实现「按标签过滤+全局统一字母排序」的需求,不需要为每个标签单独配置,只需要把排序逻辑全局统一,同时在标签模板中针对当前标签的文章集合应用这个排序即可,下面分两种方式实现:
方式一:用全局自定义过滤器统一排序逻辑(推荐)
这种方式把排序逻辑放在全局配置里,所有模板都能复用,完全符合你想要的「全局配置」诉求:
- 修改你的11ty配置文件,把原来的集合改成自定义过滤器(如果需要保留全文章排序集合,也可以同时保留):
// 新增全局排序过滤器,复用你原来的排序逻辑 eleventyConfig.addFilter("sortPostsByTitleDesc", (collection) => { // 复制集合避免修改原数据,然后按标题降序排序 return [...collection].sort((a, b) => { if (a.data.title > b.data.title) return -1; if (a.data.title < b.data.title) return 1; return 0; }); }); // 保留全文章排序集合(比如首页、全文章页面需要用到时) eleventyConfig.addCollection("postsAscending", (collection) => { return collection.getFilteredByGlob("gallery/*.md", "blog/*.md") .sort((a, b) => { if (a.data.title > b.data.title) return -1; if (a.data.title < b.data.title) return 1; return 0; }); });
- 在你的标签模板(比如
tag.liquid)中,替换原来的集合调用逻辑:
{% comment %} 精准获取当前标签对应的所有文章集合 {% endcomment %} {% assign currentTagPosts = collections[page.tag] %} {% comment %} 应用全局定义的排序过滤器 {% endcomment %} {% assign sortedTagPosts = currentTagPosts | sortPostsByTitleDesc %} {% for post in sortedTagPosts %} <!-- 这里写你的文章渲染代码,比如标题、链接、摘要等 --> <article> <h2><a href="{{ post.url }}">{{ post.data.title }}</a></h2> <p>{{ post.data.excerpt }}</p> </article> {% endfor %}
方式二:直接在模板中用Liquid内置过滤器排序
如果你不想新增全局过滤器,也可以直接用Liquid自带的sort过滤器快速实现,逻辑更轻量:
{% comment %} 获取当前标签文章,并按标题降序排序(和你原来的逻辑一致) {% endcomment %} {% assign sortedTagPosts = collections[page.tag] | sort: 'data.title' | reverse %} {% for post in sortedTagPosts %} <!-- 文章渲染代码 --> {% endfor %}
这里sort: 'data.title'默认是按标题升序排列,reverse反转后就和你原来的降序排序逻辑完全匹配了。
关键原理说明
- 11ty默认会为每一个标签生成专属集合:比如你在文章的front matter里写了
tags: [photography, tech],那么collections.photography就包含所有带photography标签的文章,collections.tech同理。 - 你原来的
postsAscending是跨路径的全文章聚合集合,自然无法实现标签过滤;而通过collections[page.tag]可以精准获取当前标签页对应的文章,再套用上全局统一的排序逻辑,就完美达成了你的需求。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

