首页 > 解决方案 > 在 Jekyll 中按类别显示语言过滤的帖子

问题描述

我使用由 Sylvain Durand制作的 Jekyll 多语言设置来运行多种语言的 Jekyll 博客,而无需使用任何插件。

所有帖子都有以下标记:

---
title: Hello world!
lang: en
ref: hello
---

这些帖子使用正常的文件夹结构:

jekyll
|
 -- posts
   |
   --name-of-post
   --name-of-post-2
   --name-of-post-3

我有一个名为en.md的页面,其中包含layout: home和标记,可以正确显示英文帖子,并在home.htmllang: en中使用以下代码

{% assign posts=site.posts | where:"lang", page.lang %}
<ul>
{% for post in posts %}
    <li>
        <a href="{{ post.url }}">{{ post.title }}</a>
    </li>
{% endfor %}
</ul>

但我想按类别显示帖子,按语言过滤。

试图通过以下方式实现这一目标:

  {% assign posts=site.categories | where:"lang", page.lang %}
  <div class="categories">
  {% for category in site.categories %}
  <li><a name="{{ category | first }}">{{ category | first }}</a>
    <ul>
    {% for posts in category %}

        {% for post in posts %}
        <li><a href="{{ post.url }}">{{ post.title }}</a></li>
      {% endfor %}
    {% endfor %}
    </ul>
  </li>
  {% endfor %}
  </div>

当我构建时,显示以下消息

Liquid 异常:在 /_layouts/home.html 中没有将 String 隐式转换为 Integer

尝试了许多变体,但似乎没有一个有效。

标签: jekyllliquidyaml-front-matter

解决方案


这可以解决问题:

---
Title: English posts
lang: en
---
<ul>
{% for category in site.categories %}

  {% comment %}
  Here we have something like this
  category = Array[
    "category1",
    [doc1, doc2]
  ]
  {% endcomment %}

  {% assign name = category[0] %}
  {% assign posts = category[1] %}

  {% comment %}
    >> This also works
    {% assign name = category.first %}
    {% assign posts = category.last %}
  {% endcomment %}

  {% comment %}
    >> Filtering posts based on their `lang` variable
    >> and on the current `page.lang`
  {% endcomment %}
  {% assign selectedPosts = posts | where:"lang", page.lang %}

  {% comment %}
    >> Let's make sure that we need to print something
  {% endcomment %}
  {% if selectedPosts.size > 0 %}
    <li>
      Category {{ name }} :
      <ul>
        {% for post in selectedPosts %}
        <li><a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }}</a></li>
        {% endfor %}
      </ul>
    </li>
  {% endif %}
{% endfor %}
</ul>

精简版 :

<ul class="post-list">
{% for c in site.categories %}
  {% assign selectedPosts = c.last | where:"lang", page.lang %}
  {% if selectedPosts.size > 0 %}
    <li>Category {{ c.first }} :
      <ul>
        {% for post in selectedPosts %}
        <li><a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }} - {{ post.lang }}</a></li>
        {% endfor %}
      </ul>
    </li>
  {% endif %}
{% endfor %}
</ul>

推荐阅读