按当前日期过滤帖子,然后使用限制进行循环
Filter posts by current date and then for loop with limit
我只想在主页上显示即将举行的活动,然后限制为三个。我能够遍历所有事件,但我无法弄清楚如何设置过滤器。
我最初是这样设置的,但发现循环在我设置的极限 3 处停止:
{% capture now %}{{ 'now' | date: "%Y-%m-%d" }}{% endcapture %}
{% for event in site.events limit:3 %}
{% capture date %}{{ event.date | date: "%Y-%m-%d" }}{% endcapture %}
{% if date >= now %}
因此,我意识到我需要完全在 for 循环之外设置过滤器,然后循环遍历过滤后的数组。
这是我认为可行的方法,但它不起作用:
{% capture now %}{{ 'now' | date: "%Y-%m-%d" }}{% endcapture %}
{% capture date %}{{ site.events | date: "%Y-%m-%d" }}{% endcapture %}
{% assign filtered_events = site.events | where_exp:"date", "date >= now" %}
{% for event in filtered_events limit:3 %}
<!--insert content-->
{% endfor %}
我知道我可能需要使用 where_exp 其中 returns 一个过滤数组,我可以循环使用它,但不知道如何设置它。感谢您的帮助!
我认为 where_exp
无法正常工作的根本原因是 {{ 'now' | date: "%Y-%m-%d" }}
和每个 events
日期字段的 date
格式不匹配。我正在观察 _posts
中 *.md
文件的默认日期格式是 date: "%Y-%m-%d %H:%M"
.
这里有一个 给你的,它建议规范化日期格式以进行正确比较。
使用 site.time
而不是带有自定义日期格式的 now
来简化您的代码怎么样?
site.time
The current time (when you run the jekyll command).
我能够使用我的 _posts
目录中的 minima、.md
文件在我的小型 jekyll
测试环境中运行以下内容。
{% assign filtered_posts = site.posts | where_exp: "post", "post.date >= site.time" %}
{% assign sorted-posts = filtered_posts | sort: 'post_date' | reverse %}
{% for event in sorted-posts limit:3 %}
{{ event.id | inspect }}
{% endfor %}
注意: 添加了 reverse
排序,以便您仅显示距离您使用 liquid
/[= 计算当前日期的时间最近的 3 个帖子21=].
当我在 08-12-2019 运行 上面的示例代码时 {{ event.id | inspect }}
的输出如下:
"/misc/2019/08/13/bar" "/misc/2019/08/14/lala"
"/misc/2019/08/15/bar-opy"
我的 _posts
目录中的文件。
2016-05-19-super-short-article.md
2016-05-20-my-example-post.md
2016-05-20-super-long-article.md
2016-05-20-this-post-demonstrates-post-content-styles.md
2016-05-20-welcome-to-jekyll.md
2019-08-12-foo.md
2019-08-13-bar.md
2019-08-14-lala.md
2019-08-15-bar-opy.md
2019-08-16-bar.md
我只想在主页上显示即将举行的活动,然后限制为三个。我能够遍历所有事件,但我无法弄清楚如何设置过滤器。
我最初是这样设置的,但发现循环在我设置的极限 3 处停止:
{% capture now %}{{ 'now' | date: "%Y-%m-%d" }}{% endcapture %}
{% for event in site.events limit:3 %}
{% capture date %}{{ event.date | date: "%Y-%m-%d" }}{% endcapture %}
{% if date >= now %}
因此,我意识到我需要完全在 for 循环之外设置过滤器,然后循环遍历过滤后的数组。
这是我认为可行的方法,但它不起作用:
{% capture now %}{{ 'now' | date: "%Y-%m-%d" }}{% endcapture %}
{% capture date %}{{ site.events | date: "%Y-%m-%d" }}{% endcapture %}
{% assign filtered_events = site.events | where_exp:"date", "date >= now" %}
{% for event in filtered_events limit:3 %}
<!--insert content-->
{% endfor %}
我知道我可能需要使用 where_exp 其中 returns 一个过滤数组,我可以循环使用它,但不知道如何设置它。感谢您的帮助!
我认为 where_exp
无法正常工作的根本原因是 {{ 'now' | date: "%Y-%m-%d" }}
和每个 events
日期字段的 date
格式不匹配。我正在观察 _posts
中 *.md
文件的默认日期格式是 date: "%Y-%m-%d %H:%M"
.
这里有一个
使用 site.time
而不是带有自定义日期格式的 now
来简化您的代码怎么样?
site.time
The current time (when you run the jekyll command).
我能够使用我的 _posts
目录中的 minima、.md
文件在我的小型 jekyll
测试环境中运行以下内容。
{% assign filtered_posts = site.posts | where_exp: "post", "post.date >= site.time" %}
{% assign sorted-posts = filtered_posts | sort: 'post_date' | reverse %}
{% for event in sorted-posts limit:3 %}
{{ event.id | inspect }}
{% endfor %}
注意: 添加了 reverse
排序,以便您仅显示距离您使用 liquid
/[= 计算当前日期的时间最近的 3 个帖子21=].
当我在 08-12-2019 运行 上面的示例代码时 {{ event.id | inspect }}
的输出如下:
"/misc/2019/08/13/bar" "/misc/2019/08/14/lala" "/misc/2019/08/15/bar-opy"
我的 _posts
目录中的文件。
2016-05-19-super-short-article.md
2016-05-20-my-example-post.md
2016-05-20-super-long-article.md
2016-05-20-this-post-demonstrates-post-content-styles.md
2016-05-20-welcome-to-jekyll.md
2019-08-12-foo.md
2019-08-13-bar.md
2019-08-14-lala.md
2019-08-15-bar-opy.md
2019-08-16-bar.md