Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Group posts by month in Jekyll archive page
---
layout: default
title: Archive
---
<div class="post">
<h2>Archive</h2>
<ul>
{% for post in site.posts %}
{% unless post.next %}
<h3>{{ post.date | date: '%Y %b' }}</h3>
{% else %}
{% capture year %}{{ post.date | date: '%Y %b' }}{% endcapture %}
{% capture nyear %}{{ post.next.date | date: '%Y %b' }}{% endcapture %}
{% if year != nyear %}
<h3>{{ post.date | date: '%Y %b' }}</h3>
{% endif %}
{% endunless %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
</div>
@trevorknight

This comment has been minimized.

Copy link

commented Apr 3, 2017

Yours is an elegant solution to the shortcomings of previous versions of Jekyll. Luckily in late 2016, Jekyll added a group_by_exp filter that can do this much more cleanly.

<h2>Archive</h2>
{% assign postsByYearMonth = site.posts | group_by_exp:"post", "post.date | date: '%Y %b'"  %}
{% for yearMonth in postsByYearMonth %}
  <h3>{{ yearMonth.name }}</h3>
    <ul>
      {% for post in yearMonth.items %}
        <li><a href="{{ post.url }}">{{ post.title }}</a></li>
      {% endfor %}
    </ul>
{% endfor %}

Documentation can be found on the Jekyll Templates page.

@jameswilson

This comment has been minimized.

Copy link

commented Nov 3, 2018

Thanks @trevorknight. I've adapted your group_by_exp example into my by-year implementation, and it shaved a good 12% off the overall Jekyll build time. ⚡️ 💯

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.