如何在 Jekyll 中设置相关 collection 项而不是相关帖子?

How to set up related collection items rather than related posts in Jekyll?

我已经通过使用 site.related_posts 和以下 Liquid 模板在我的站点中成功实施了 相关的 posts

下面的代码 returns 4 post 与每个 post 页面上的标签相关,到目前为止还不错,但是对于 Jekyll collections?

{% 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 的文档,当你创建一个 collection 时,它可以通过 site Liquid 变量使用,很像 site.pagessite.posts,所以为了为我的投资组合创建一个相关的collection项目 collection 我复制了上面的Liquid逻辑并分配了 site.portfolio 为 posts,参见:

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

所以我在 _portfolio collectionas 中的每个 "project.md" 文档的 front-matter 上设置 tags: [tag1, tag2, tag3],就像我通常对 posts 和上面的液体逻辑 returns 相关的 投资组合 collection 项目 .

无论如何,虽然我不确定这是否是实现此类功能的正确途径,但它按预期工作。当谈到 collections.

时,我找不到 site.related_posts 的任何参考/用法

如果您对这个问题有任何想法,我将不胜感激。提前致谢。

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