使用Liquid按类别过滤Jekyll集合中的热门帖子

使用Liquid按类别过滤Jekyll集合中的热门帖子,jekyll,liquid,Jekyll,Liquid,我有一个插件,可以根据页面浏览量在Jekyll中的一个集合中生成一个流行帖子列表。在收集我有两个类别,我想过滤相同类别的原始文章流行的帖子 以下是我编写的代码: <ul> {% if page.path contains '_kb/cat1' %} {% assign popular_posts = site.popular_posts | where:"category","cat1" %} {% for page in popular_posts | limi

我有一个插件,可以根据页面浏览量在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>

我假设您正试图让代码显示与当前帖子相同类别的其他流行帖子。例如,如果您在一篇关于Java的文章中,您希望显示关于Java的流行文章,除了当前的文章本身

  • 如果您已经在每个帖子中设置了category,您可以使用Jekyll中提供的内置变量,
    page.categories
    ,该变量返回一个类别列表,例如,如果您在
    work
    code
    类别下有一篇帖子,您将获得
    ['work','code']
    如果page.path包含“\u kb/cat1”%},您可以立即获得基于该类别的热门帖子,而不是
    {%。这应该行得通(我现在没有安装Jekyll来测试这一点)

    我相信您的问题是您重用了
    页面
    变量,一旦您在流行帖子%}
    中对页面执行
    {%for 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 %}
    
    {popular_post中popular_post的百分比|限制:3%}
    {%1\u post.id==page.id%}
    
  • {%end除非%} {%endfor%}
    编辑:由于上面的代码可能只显示3篇文章,难看的解决方法是使用
    限制:4
    ,但当当前文章不受欢迎时,显示4篇文章是一种边缘情况,您可以执行以下操作:

    {%assign popular_posts=site.popular_posts |其中“id”!=page.id%} {流行帖子中流行帖子的百分比|限制:3%} {%1\u post.id==page.id%}
  • {{page.title}}
  • {%end除非%} {%endfor%}


    我想这是一个嵌套条件的问题,因为我不确定Liquid是否允许其过滤器中存在多个条件,但您希望在执行
    限制之前过滤掉当前帖子:3

    请在您尝试过的内容(使用该代码)和不起作用的内容上显示一些努力。由于这个问题(以及你刚刚在Jekyll上发布的其他问题)似乎只是“我复制了这个代码,我不知道如何使它达到我想要的效果,请修复这个代码,或者请给我我喜欢的代码。@matrixanomaly Hi Lee,谢谢你的评论。我已经从问题中删除了我尝试过的代码,但它不起作用。您可以在修订版中看到它。这是我自己的代码,我没有复制到任何地方。我知道我可以使用类似于
    if post!=在Ruby中使用self
    ,但我不知道如何在液体中使用。我读了一些教程,但没有找到答案。这就是我在这里提问的原因。我没有注意到您所做的修改,谢谢您强调了这一点,我很抱歉假设您将代码带到了其他地方(您应该提到您已经编写了代码,您不确定如何从那里继续,因为您的其他问题主要是这里的一些代码)。很高兴知道你表现出了努力。我花了些时间来研究你的问题,我的答案如下。希望你能成功!非常感谢你!我以为你应该先试试,然后再寻求帮助:)你好,李,非常感谢你的回复!不幸的是,对于page.categories%}中的类别,我不能使用此部分
    {%。因此,我想我必须为集合中的每个类别使用
    {%if page.category=='cat1%}
    。非常感谢您在第二部分中的澄清!我明白我为什么会有问题了。但是现在,当我在一个受欢迎的帖子上时,我只有另外两个帖子的列表。我想展示3篇文章,但是用下一篇热门文章代替原来的。我将在下面发布我现在正在处理的代码。啊,我知道问题是什么了,因为您正在使用集合,在这种情况下,除了在单独的frontmatter中为每个集合创建一个
    category
    变量外,这样做可能会更好:您现在所做的可能更好。至于只有两个职位的人,增加一个
    where
    子句就行了。(更新答案)非常感谢!我还没有试过第二部分(使用
    where
    子句)。但是我尝试访问集合的
    category
    属性,使代码首先适用于所有集合。但是现在它迭代了集合中的每个文档,并给出了与集合中文档数量相等的流行帖子列表数量。(我将在下面的答案中发布代码。)@jupiteror因为你对SO还比较陌生,我谦恭地建议,如果其他人的答案有用/有帮助,你就投票给他们,然后如果他们确实解决了问题,就把它标为答案。:)每个回答问题的人都会在你可能遇到的问题上投入时间,祝你好运。你好,我对你的答案投了赞成票,非常感谢你的努力。但是
    其中的“id”!=page.id
    在分配标记中不起作用。它给出了一个错误,表示参数数目错误,3代表1。也许你知道我如何在插件中做到这一点?我在这里发布了一个类似的问题。如果您能就逻辑给出一些建议(首先排序,然后按类别分组,等等),我将不胜感激。我将尝试自己编写代码。
    <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>
    
    {% if user.name != 'tobi' %}
      Hello non-tobi
    {% endif %}
    # Same as above
    {% unless user.name == 'tobi' %}
      Hello non-tobi
    {% endunless %}
    
    {% 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 %}