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

时间:2015-08-16 20:06:48

标签: jekyll liquid

我有一个插件,根据他们的页面视图生成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>
  1. 有没有办法让这段代码更简单?
  2. 如何从此列表中排除原始帖子?例如,如果我在热门帖子1上,我想显示热门帖子2,3和4的链接,而不是原始帖子本身。
  3. 我知道我可以在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 %}
    

1 个答案:

答案 0 :(得分:1)

我假设您正在尝试让您的代码显示与当前帖子属于同一类别的其他热门帖子。例如,如果您在关于Java的帖子中,您希望显示有关Java的热门帖子,除了当前帖子本身。

  1. 如果您已在每个帖子中设置了类别,则可以使用Jekyll中提供的内置变量page.categories,该变量返回类别列表,例如,如果您的帖子属于以下类别: workcode,您获得['work','code']Here's a list of page variables
  2. 而不是{% 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>
    
    1. 您可以使用2种方法排除原始帖子。检查您正在迭代的帖子是否具有与当前帖子idurltitle相同的值,例如{% if popular_page.id != page.id %}page.url显示在页面变量中。第二种方法是使用unless子句。
    2. Liquid for Designers所示:

      {% 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%}                  

    3.                  {{ 页面标题 }}                  
    4.         {%endunless%}     {%endfor%}

      我认为这是一个嵌套条件的问题,因为我不确定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); 之前过滤掉当前帖子。