如何在Jekyll中设置相关的收藏品而不是相关的帖子?

时间:2015-11-29 19:37:30

标签: html jekyll liquid github-pages

我已使用site.related_posts使用以下Liquid模板在我的网站中成功实施了相关帖子

下面的代码在每个帖子页面上返回4个与标签相关的帖子,到目前为止还不错,但是为Jekyll系列实现这样的效果的最佳方法是什么?

{% assign hasSimilar = '' %}

{% for post in site.related_posts %}
 {% assign postHasSimilar = false %}
   {% for tag in post.tags %}
     {% for thisTag in page.tags %}
       {% if postHasSimilar == false and hasSimilar.size < 4 and post != page and tag == thisTag %}
       {% if hasSimilar.size == 0 %}
       {% endif %}

     <a href="{{ site.baseurl }}{{ post.url }}" class="entry">
      <div class="entry-media">
      <img src="{{ post.thumbnail | prepend: site.baseurl }}" alt="">
      <p class="post-cat">{% for category in post.categories.last %}{{ category }}{% endfor %}</p>
      </div>
      <h6 class="entry-title">{{ post.title | truncatewords: 70, '...' }}</h6>
      <p class="post-date">{{ post.date | date: "%d/%m/%Y" }}</p>{% if post.series %}(Series: {{ post.series }}){% endif %}
     </a>
{% capture hasSimilar %}{{ hasSimilar }}*{% endcapture %}
 {% assign postHasSimilar = true %}{% endif %}
{% endfor %}
   {% endfor %}
     {% endfor %}
       {% if hasSimilar.size > 0 %}

{% endif %}

根据Jekyll的文档,当您创建一个集合时,它可以通过site Liquid变量获得,就像site.pagessite.posts一样,所以为了创建一个我的投资组合集合的相关集合项我复制了上面的Liquid逻辑并将 site.portfolio 指定为帖子,请参阅:

{% assign posts = site.portfolio | sort: "tags" %}

所以我在每个&#34; project.md&#34;上设置了tags: [tag1, tag2, tag3]。我_portfolio集合中的文档正面事项,因为我通常会使用帖子,上面的流量逻辑会返回相关的投资组合集合项

无论如何,虽然我不确定这是否是实现此类功能的正确途径,但它仍可按预期工作。 site.related_posts来收集时,我找不到任何参考/用法。

我真的很感激有关这个问题的任何想法。提前谢谢。

1 个答案:

答案 0 :(得分:2)

site.related_poststen most recent posts

因此,您的代码只会查找十个帖子中的相关内容,而不是所有帖子。

以下代码将查找site.posts或任何site.collection

的标签相关项目
{% assign pageTagsNumber = page.tags | size %}
{% assign related        = "" | split: "/" %}<!-- create empty array -->
{% assign relatedCount   = 0 %}
{% assign maxRelated     = 4 %}<!-- maximum number of related items -->
{% assign minTagMatch    = 4 %}<!-- minimum number of tag match to be a related -->
{% if minTagMatch > pageTagsNumber %}
    {% assign minTagMatch = pageTagsNumber %}
{% endif %}
{% assign matchedComplete = false %}<!-- flag -->

<!--
numberOfTag to match to be in the related list
Will try to match all page tags, then page tags size - 1, -2, until reaching minTagMatch
-->
{% for numberOfTag in (minTagMatch...pageTagsNumber) reversed %}

  <!-- Looping over site.posts or any site.mycollection -->
  <!-- here you can do {% for item in site.mycollection %} -->
  {% for item in site.posts %}
    <!-- !!! ITEM SPECIFIC -->
    <!-- for a collection change item.title == page.title if needed-->
    {% if related contains item or item.title == page.title %}
        <!--
        Don't scan an item that is already in related
        Don't scan an item if we are on his page
        -->
        {% continue %}<!-- go to next item -->
    {% endif %}
    {% assign itemTagsNumber = item.tags | size %}
    {% if itemTagsNumber < numberOfTag %}
      <!-- Not enough tags {{ itemTagsNumber }} -->
      {% continue %}<!-- go to next item -->
    {% endif %}
    {% assign matchingTags = 0 %}<!-- tag match counter -->
    {% for tag in page.tags %}
      <!-- Comparing page tag "{{ tag }}" to {{ item.tags | join: ", " }} -->
      {% if item.tags contains tag %}
        <!-- one matching tag increment matchingTags counter-->
        {% assign matchingTags = matchingTags | plus: 1 %}

        <!-- We have a match and {{ matchingTags }} matching tags total -->
        {% if matchingTags >= numberOfTag %}
            <!-- we have enough matching tag, this is a related item -->
            {% capture html %}
            <li><a href="{{ site.baseurl }}{{ item.url }}">
            {{ item.title }}
            {% assign pageTagsNumber = item.tags | size %}
             - has {{ pageTagsNumber }} tags
             - match on {{ matchingTags }} tags
            </a></li>
            {% endcapture %}
            {% assign related = related | push: html %}
            {% assign relatedCount = related | size %}
            {% if relatedCount >= maxRelated %}
                <!-- if we have all our related set the matchedComplete flag to true -->
                {% assign matchedComplete = true %}
            {% endif %}
            {% break %}
        {% endif %}
      {% endif %}
    {% endfor %}
    {% if matchedComplete == true %}
        <!-- matchedComplete breaking item loop! -->
        {% break %}
    {% endif %}
  {% endfor %}
  {% if matchedComplete == true %}
      <!-- matchedComplete breaking numberOfTag loop! -->
      {% break %}
  {% endif %}
{% endfor %}
{% if relatedCount > 0 %}

<!-- print related items -->
<ul>
  {% for item in related %}
    {{ item }}
  {% endfor %}
</ul>
{% endif %}