在 Jekyll 中按类别显示语言过滤的帖子
Display language filtered posts by category in Jekyll
我 运行 使用 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: home
和 lang: 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>
构建时,显示如下信息
Liquid Exception: no implicit conversion of String into Integer in /_layouts/home.html
尝试了很多变体,但 none 似乎有效。
使用 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 %}
您想要 do/did 是用页面语言过滤 'posts' 变量。这确实可以通过 assign
使用 where
过滤器来完成,但应该看起来像这样(因为 'lang' 是个人 post 的属性,而不是类别的属性):
{% 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 数组逻辑。
这样就可以了:
---
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>
我 运行 使用 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: home
和 lang: 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>
构建时,显示如下信息
Liquid Exception: no implicit conversion of String into Integer in /_layouts/home.html
尝试了很多变体,但 none 似乎有效。
使用 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 %}
您想要 do/did 是用页面语言过滤 'posts' 变量。这确实可以通过 assign
使用 where
过滤器来完成,但应该看起来像这样(因为 'lang' 是个人 post 的属性,而不是类别的属性):
{% 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 数组逻辑。
这样就可以了:
---
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>