我有一个插件,根据他们的页面视图生成Jekyll集合中的热门帖子列表。内部集合我有两个类别,我想过滤与原始帖子相同类别的热门帖子。
这是我写的代码:
<ul>
{% if page.path contains '_kb/cat1' %}
{% assign popular_posts = site.popular_posts | where:"category","cat1" %}
{% for page in popular_posts | limit:3 %}
<li>
<a href="{{ page.url }}" title="{{ page.title }}">{{ page.title }}</a>
</li>
{% endfor %}
{% else %}
{% assign popular_posts = site.popular_posts | where:"category","cat2" %}
{% for page in popular_posts | limit:3 %}
<li>
<a href="{{ page.url }}" title="{{ page.title }}">{{ page.title }}</a>
</li>
{% endfor %}
{% endif %}
</ul>
我知道我可以在Ruby中使用类似if post != self
的东西,但我不知道如何在Liquid中使用它。我已经阅读了一些教程,但没有找到答案。这就是我在这里问的原因。
编辑:我首先尝试访问集合的属性,如下面的@matrixanomaly所示。但现在它遍历集合中的每个文档,并给出了热门帖子列表的数量等于集合中的文档数量。这是我的代码。有没有办法将这个循环限制为只有一个,文档本身(或原始帖子)?
{% for collection in site.collections %}
{% capture label %}{{ collection | first }}{% endcapture %}
{% for doc in site.collections.[label].docs %}
{% assign category = doc.category %}
{% if page.category == category %}
{% assign popular_posts = site.popular_posts | where:"category",category %}
{% for node in popular_posts | limit:3 %}
{% unless node.url == page.url %}
<li>
<a href="{{ node.url }}" title="{{ node.title }}">{{ node.title }}</a>
</li>
{% endunless %}
{% endfor %}
{% endif %}
{% endfor %}
{% endfor %}
答案 0 :(得分:1)
我假设您正在尝试让您的代码显示与当前帖子属于同一类别的其他热门帖子。例如,如果您在关于Java的帖子中,您希望显示有关Java的热门帖子,除了当前帖子本身。
page.categories
,该变量返回类别列表,例如,如果您的帖子属于以下类别: work
和code
,您获得['work','code']
。 Here's a list of page variables。而不是{% if page.path contains '_kb/cat1' %}
,您可以根据类别立即获得热门帖子。这应该工作(我现在没有Jekyll安装来测试这个)。
<ul>
<!-- uses categories of the current post -->
<!--I used theCategory to avoid confusion, use any variable you want -->
{% for theCategory in page.categories %}
{% assign popular_posts = site.popular_posts | where:"category", theCategory %}
{% for page in popular_posts | limit:3 %}
<li>
<a href="{{ page.url }}" title="{{ page.title }}">{{ page.title }}</a>
</li>
{% endfor %}
{% endfor %}
</ul>
id
,url
,title
相同的值,例如{% if popular_page.id != page.id %}
或page.url
显示在页面变量中。第二种方法是使用unless
子句。{% if user.name != 'tobi' %}
Hello non-tobi
{% endif %}
# Same as above
{% unless user.name == 'tobi' %}
Hello non-tobi
{% endunless %}
我相信您的问题,您已经重复使用page
变量,一旦{% for page in popular_posts %}
使page
成为本地变量,您就无法访问{% for popular_post in popular_posts | limit:3 %} <!-- renamed variable -->
{% unless popular_post.id == page.id %}
<li>
<a href="{{ page.url }}" title="{{ page.title }}">{{ page.title }}</a>
</li>
{% endunless %} <!-- you can use if and endif also --->
{% endfor %}
当前的帖子变量值。
您希望在最里面的循环中换出的内容是:
limit:4
编辑:由于上面的代码可能只显示3,因此丑陋的解决方法是使用limit:3
,但是当前帖子不是时会显示4个帖子的边缘情况很受欢迎,你可以这样做:
{%assign popular_posts = site.popular_posts |其中“id”!= page.id%} {%for popular_post in popular_posts |限制:3%} {%除非popular_post.id == page.id%}
我认为这是一个嵌套条件的问题,因为我不确定Liquid是否在其过滤器中允许多个条件,但您想在执行var arrA = [], arrB = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
function addToArray(item){
if(arrA.indexOf(item) === -1){
arrA.push(item);
}
}
function removeFromArray(item){
var index = arrB.indexOf(item);
if (index > -1) {
arrB.splice(index, 1);
}
}
function applyItems(arrayOfItems){
arrayOfItems.map(function(item) {
addToArray(item);
removeFromArray(item);
});
}
applyItems([0, 5, 3]);
console.log(arrA);
console.log(arrB);
之前过滤掉当前帖子。