How to change the default order pages in Jekyll?

You can create custom order of your menu items like this:

  1. In your pages front matter add the order field (you can name it as you prefer)
    ---
    layout: default
    published: true
    title: Page title
    order: 1
    ---
    
  2. When getting pages, apply the 'sort' filter
    {% assign sorted_pages = site.pages | sort:"order" %}
    {% for node in sorted_pages %}
      <li><a href="{{node.url}}">{{node.title}}</a></li>
    {% endfor %}
    

You'll end up with an ordered (ASC) list of pages, based on the 'order' field value you add to each page.


Update: Some ordering functionality seems to have been added to Jekyll: https://github.com/plusjade/jekyll-bootstrap/commit/4eebb4462c24de612612d6f4794b1aaaa08dfad4

Update: check out comment by Andy Jackson below – "name" might need to be changed to "path".

This seems to work for me:

{% assign sorted_pages = site.pages | sort:"name" %}
{% for node in sorted_pages %}
  <li><a href="{{node.url}}">{{node.title}}</a></li>
{% endfor %}

name is file name. I renamed pages to 00-index.md, 01-about.md etc. Sorting worked, but pages were generated with those prefixes, which looked ugly especially for 00-index.html.

To fix that I override permalinks:

---
layout: default
title: News
permalink: "index.html"
---

Sadly, this won't work with custom attributes, because they are not accessible as methods on Page class:

{% assign sorted_pages = site.pages | sort:"weight" %} #bummer