Jekyll Liquid筛选layout为project的文章时limit语法错误求助
问题分析与解决
你遇到的Liquid语法错误,核心原因是把集合过滤器(limit/offset)用在了条件判断语句里,这完全不符合Liquid的语法规则:
post.layout contains "project"是一个条件判断,用来检查单篇文章的layout属性是否匹配指定字符串;- 而
limit、offset是集合过滤器,只能用来处理数组/集合(比如site.posts这种文章列表),不能直接附加在条件判断后面。
你原本的写法试图在if里同时做条件筛选和数量限制,这会让Liquid解析器混淆语法结构,所以才抛出了"Expected end_of_string but found pipe"这类错误。
修正后的代码
正确的思路是:先把所有layout为project的文章筛选出来形成一个独立集合,再对这个集合分别做数量限制和偏移,最后循环输出:
{% comment %} 先筛选出所有layout为project的文章 {% endcomment %} {% assign project_posts = site.posts | where: "layout", "project" %} {% comment %} 取第1篇文章,显示为h1 {% endcomment %} {% for post in project_posts limit:1 %} <h1>{{ post.title }}</h1> {% endfor %} {% comment %} 从第2篇开始,取4篇文章,显示为h2 {% endcomment %} {% for post in project_posts offset:1 limit:4 %} <h2>{{ post.title }}</h2> {% endfor %}
代码解释
{% assign project_posts = site.posts | where: "layout", "project" %}:
用where过滤器从site.posts中筛选出所有layout属性等于project的文章,把结果存入project_posts变量。这样后续的循环只需要处理这个目标集合,不用每次都重复判断条件,逻辑更清晰。第一个循环
limit:1:
直接对project_posts集合取前1篇,不需要额外的if判断——因为集合里已经都是符合条件的文章了。第二个循环
offset:1 limit:4:offset:1表示跳过集合的第1个元素(也就是已经输出的那篇),limit:4表示最多取后面的4篇,完美实现你想要的分段显示效果。
这种写法不仅完全符合Liquid语法,后续维护起来也更省心。
内容的提问来源于stack exchange,提问作者user7770146
相关产品推荐
相关产品推荐

