在Jekyll,如何显示“上周的帖子”

时间:2017-10-10 17:07:04

标签: jekyll liquid

我不确定是否使用流动语法来帮助我提取在构建日期的同一周内发布的帖子。那可能吗?

有一些更简单的方法可以获得最近发布的帖子,但这种方法对我的项目很有用。我已经尝试过几种我通过搜索找到但却没有快乐的东西。

3 个答案:

答案 0 :(得分:2)

  

甚至给这个回答第二个想法之前,要考虑的是,至少是这个答案的第一部分没有按事实'吨真的工作,因为杰基尔是的静态的网站生成器和因此,显示的帖子是相对于上一个构建日期,可能与当前日期不同。

     

答案的第二部分更深入地介绍了实际生成"最近帖子的列表的概念,而不是上周的#34;帖子#34;。

基本上用语言解释代码:首先我们得到current yearcurrent week,然后我们遍历每个帖子并将current yearcurrent week与{{1}进行比较邮件的{}和week。如果匹配,则显示帖子。

显示 - 构建周:

enter image description here

year

显示 - 建立日和提前6天:

enter image description here

{% assign currentYear = site.time | date: "%Y" %}
{% assign currentWeek = site.time | date: "%W" %}

{%- for post in site.posts -%}

    {% assign postYear = post.date | date: "%Y" %}
    {% assign postWeek = post.date | date: "%W" %}

    {%- if currentYear == postYear and currentWeek == postWeek -%}
        <a href="{{ post.url }}">{{ post.title }}</a>
    {%- endif -%}

{%- endfor -%}

为了挽救这个答案,虽然它已经偏离了当然......我用类似的逻辑编写了这段代码,但这一次得到的是{% assign currentYear = site.time | date: "%Y" %} {% assign currentDay = site.time | date: "%j" | plus: 0 %} {% assign currentDay_minus_week = site.time | date: "%j" | minus: 7 %} {%- for post in site.posts -%} {% assign postYear = post.date | date: "%Y" %} {% assign postDay = post.date | date: "%j" | plus: 0 %} {%- if currentYear == postYear and postDay > currentDay_minus_week and postDay <= currentDay -%} <a href="{{ post.url }}">{{ post.title }}</a> {%- endif -%} {%- endfor -%} year最新帖子并显示当年和那周发布的所有帖子。

即使您在不创建新帖子的情况下继续构建网站,这也会显示出一些内容。但它也只显示了一个帖子,如果你的上一篇文章是本周发布的唯一帖子,可能有点笨......

另一方面,最简单的方法是显示&#34;最近的帖子&#34;可能只是使用week并将最近的帖子限制为最近5篇帖子或类似内容:limit

显示 - 最新发布周:

enter image description here

{%- for post in site.posts limit: 5 -%}

显示 - 最新发布日和提前6天

enter image description here

{% assign latestPost_year = site.posts.first.date | date: "%Y"  %}
{% assign latestPost_week = site.posts.first.date | date: "%W"  %}

{%- for post in site.posts -%}

    {% assign postYear = post.date | date: "%Y" %}
    {% assign postWeek = post.date | date: "%W" %}

    {%- if latestPost_year == postYear and latestPost_week == postWeek -%}
        <a href="{{ post.url }}">{{ post.title }}</a>
    {%- endif -%}

{%- endfor -%}

答案 1 :(得分:1)

你永远不知道Jekyll何时建立,所以Jekyll应该输出一个大的帖子列表。你可以使用Joonas的代码。然后你应该使用javascript来隐藏不相关的帖子(超过一周的帖子)。

这可以通过在列表中添加自定义属性轻松完成,如下所示:

<li date="{{ post.date }}">{{ post.title }}</li>

使用jQuery(或vanilla js)隐藏旧帖子:

// loop through all list items with a date
$('li[date]').each(function(){
  // create a postDate in a date object
  var postDate = new Date($(this).attr('date'));
  // create an object with the date of one week ago
  var oneWeekAgo = new Date();
  oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);
  // compare dates and hide old posts
  if(postDate<oneWeekAgo) $(this).hide();
});

答案 2 :(得分:1)

  

above solution有效,但不会跨越多年。

     

因此,我利用这些概念,提出了一种更简单,更灵活的解决方案,用于过滤timeframe(可以是几秒,几小时,几天,几周或几个月的任何可变时间跨度)。我的解决方案变量更少,逻辑更少。

Liquid date/time使用unix时间戳(%s = seconds since 1970)。所以我在几秒钟内保持timeframe并进行转换一段时间。 86400 = 1 day604800 = 1 wk2678400 = 31 days,...等等。

该代码还假设您的帖子在帖子前端使用last_modified_at。如果你不是,你可以替换post.date

简单解决方案

Calendar Icon

列出上周内的帖子

{% assign timeframe = 604800 %}

{% for post in site.posts %}
  {% assign post_in_seconds = post.last_modified_at | date: "%s" | plus: 0 %}
  {% assign recent_posts = "now" | date: "%s" | minus: timeframe  %}

  {% if post_in_seconds > recent_posts %}
    <a href="{{ post.url }}">{{ post.title }}</a>
  {% endif %}
{% endfor %}

替代

Calendar Icon

在时间范围内列出帖子并标记新内容或已修改

此代码会列出限制内的所有帖子,并在timeframe中将帖子标记为新帖子或已修改。列表长度限制为maxposts注意: css类旨在利用Bootstrap,根据自己的喜好删除/编辑。

  • timeframe 2419200 = 4周内的秒数
  • maxposts = 10
  • label_FOOBAR只是用液体处理html的简洁方法

带有新/修改标记的示例结果&amp;日期

Results

<强>代码

{% assign timeframe = 2419200 %}
{% assign maxposts = 10 %}
{% assign date_format = site.minima.date_format | default: "%m/%d" %}

<ul class="post-list text-muted list-unstyled">
{% for post in site.posts limit: maxposts %}
  {% assign post_in_seconds = post.last_modified_at | date: "%s" | plus: 0 %}
  {% assign recent_posts = "now" | date: "%s" | minus: timeframe %}
  {% assign post_updated = post.last_modified_at | date: date_format %}
  {% capture post_date %}<small>{{ post.date | date: date_format }}</small>{% endcapture %}

  {% if post_in_seconds > recent_posts %}
  {% capture label_new %}<span class="label label-primary">new</span>{% endcapture %}
    {% if post.last_modified_at > post.date %}
      {% assign label_new = '' %}{% comment %}Clear NEW if modified{% endcomment %}
      {% capture label_updated %}<span class="label label-info">Updated <span class="badge">{{ post_updated }}</span></span>{% endcapture %}
    {% endif %}
  {% endif %}
  <li>
    <h4>{{ post_date }}
      <a class="post-link" href="{{ post.url | relative_url }}">
        {{ post.title | escape }}</a> {{ label_new }}{{ label_updated }}
      </h4>
  </li>
  {% assign post_date = '' %}
  {% assign label_updated = '' %}
{% endfor %}
</ul>