【问题标题】:Display language filtered posts by category in Jekyll在 Jekyll 中按类别显示语言过滤的帖子
【发布时间】:2019-03-26 09:36:51
【问题描述】:

我使用 Sylvain Durand 的设置 making Jekyll multilingual 运行多种语言的 Jekyll 博客,而没有使用任何插件。

所有帖子都有以下标记:

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

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

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

我有一个名为 en.md 的页面,其中包含 layout: homelang: en 标记,可以正确显示英文帖子,并在 home.html

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

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

液体异常:在 /_layouts/home.html 中没有将字符串隐式转换为整数

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

【问题讨论】:

    标签: jekyll liquid yaml-front-matter


    【解决方案1】:

    这就是诀窍:

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

    【讨论】:

    • 完美运行,在{% for c in site.categories %} 之后添加{% unless c[0] == "en" %} 以过滤掉我的英语文件夹,因为我在大多数帖子中使用category: en subcategoryname
    • 无需使用除非,帖子已被 lang 过滤:{% assign selectedPosts = c.last | where:"lang", page.lang %}
    【解决方案2】:

    借助 Jekyll 的内置分类解决方案

    我找到了this partial solution,和你一样……:

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

    您想要做/做的是使用页面语言过滤“帖子”变量。这确实可以通过 assign 使用 where 过滤器来完成,但应该看起来像这样(因为“lang”是单个帖子的属性,而不是类别的属性):

    {% assign lang_posts = posts | where:"lang", page.lang %}
    

    这导致以下代码:

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

    没有 Jekyll 的内置分类解决方案

    如果你在前面有一个随机的类别列表,像这样:

    - categories:
      - web
      - css
      - internet
    

    ...而您的网站_config.yml 包含一个类似(但更完整)的列表,如下所示:

    - categories:
      - web
      - css
      - internet
      - html5
      - jekyll
    

    你还有另一个问题。在这种情况下,您没有使用 Jekyll 的内置类别解决方案,this solution 不适用。在这种情况下,许多语句的含义不同,例如:

    {% for category in site.categories %}
      {{ category | first }}
    

    这意味着你遍历来自_config.yml 的所有现有类别,然后category | first 应该是category。在这种情况下,您可能需要这样的东西:

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

    请注意,这只是覆盖 Jekyll 类别变量的简单 Jekyll/liquid 数组逻辑。

    【讨论】:

      猜你喜欢
      • 2014-01-19
      • 1970-01-01
      • 2014-12-12
      • 2015-11-09
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多