Question about site.posts values


#1

Probably a dumb question - I’m trying to get the first and last post for my site. I’m using this to capture the posts:

{% capture lastPost %}{{ site.posts | first }}{% endcapture %}
{% capture firstPost %}{{ site.posts | last }}{% endcapture %}

But if I {{lastPost.title}} I get nothing. I then noticed that if I did {{lastPost}} I got the rendered output of the post itself. How would I get the post “object” instead?


#2

And duh - now I see it. I’m rendering the page. Sigh. So let me say this - I was able to output the last page title and date like so:

{{ site.posts[0].title }} ({{ site.posts[0].date | date: "%Y-%m-%d" }})

But every attempt to get the last value of site.posts has failed for me. I tried site.posts[site.posts.size-1] but that returned nothing.


#3

I’ve tried this to get the “last index”:

{% capture lastdx %}{{ site.posts.size | minus: 1 }}{% endcapture %}

if I output lastdx, I get 61. If I do:

{{ site.posts[lastdx].title }

I get nothing. If I change lastdx to a hard coded value of 61, it works.


#4

Not tested, but I think capture assigns the variable as a string, which could explain why it’s not working since it expects a number.

Maybe try filtering lastdx with something like {{ lastdx | abs }} before you try to call it on site.posts to convert the string to a number.


#5

You could also use assign which might be cleaner.

{% assign lastdx = site.posts.size | minus: 1 %}


#6

Oh and even simpler are first and last. Use dot notation and you can access the entire object.

In your case {{ site.posts.first.title }} and {{ site.posts.last.title }} will get the title of the first and last posts. You can replace title with any variable available in the post’s YAML Front Matter… date, content, excerpt, etc.


How to show the latest post as the homepage?
#7

Awesome - all of these answers helped me learn a bit. Thank you!