Get next and previous elements out of an array in liquid

jekyllliquid

Short version:

I want to add 1 to a number in a liquid template and use the result as an array index.

{% capture plus_one %}{{ 0 | plus: 1 }}{% endcapture %}
<div>-Value of plus_one: {{plus_one}}</div>
<div>-This works: {{site.posts[1].title}}</div>
<div>-This doesn't: {{site.posts[plus_one].title}}</div>

Result:

-Value of plus_one: 1
-This works: The Zone
-This doesn't:

Long version:

I'm using Jekyll, with no plugins. I want to give the current post a link to the next post that is in the same category. (The category is hardcoded to 'journal' in this code.)

My code loops over all posts in the category array, looking for the current post. When it is found, I try to grab the next post in the category array.

{% for num in (0..site.categories.journal.size) %}
    {% assign page2 = site.categories.journal[num] %}
        {% if page2.title == page.title and page2.date == page.date %}
            {% capture plus_one %}{{ num | plus: 1 }}{% endcapture %}
        {% endif %}
{% endfor %}

<div>value of plus_one: {{plus_one}}</div>
<div>This doesn't work: {{site.categories.journal[plus_one].title}}</div>
<div>This does: {{site.categories.journal[1].title}}</div>

Result:

<div>value of plus_one: 1</div>
<div>This doesn't work: </div>
<div>This does: A Blog Post Title</div>

I guess the value of my variable 'plus_one' is being treated as a string instead of a number.

Is there any way to convert it to a number?

Or is there another way to achieve what I'm trying to do?

Best Answer

{% for category in site.categories %}
    {% assign catg_name = category.first %}
    {% if catg_name == page.category %}
        {% assign catg_posts = category.last %}
    {% endif %}
{% endfor %}
{% for post in catg_posts %}
    {% if post.title == page.title %}
        {% unless forloop.last %}
            {% assign next = catg_posts[forloop.index] %}
            <li class="previous">
            <a href="{{ site.baseurl }}{{ next.url }}">&larr;{{ next.title }}</a>
            </li>
        {% endunless %}
        {% unless forloop.first %}
            <li class="next">
            <a href="{{ site.baseurl }}{{ prev.url }}">{{ prev.title }}&rarr;</a>
            </li>
        {% endunless %}
    {% endif %}
    {% assign prev = post %}
{% endfor %}

As you have mentioned you can save and use the previous iteration value for the previous post link( in my case I use it as the next post link since I don't want the default newest-first order ). For the next array element you can use forloop.index. This is the 1-based index of the for loop and will give you the next item of a zero-based array.

Related Topic