layout: page description: Blog page pagination built-in title: Pagination built-in tagline: Jekyll blog page pagination built-in group: pages toc: true


:website: jekyllrb.com/docs/posts/ :revnumber: 3.2.1

//Ref :liquid-date-formats: docs.shopify.com/themes/liquid-documentation/filters/additional-filters#date

.boxShadow

With many websites—especially blogs—it’s very common to break the main listing of posts up into smaller lists and display them over multiple pages.

Jekyll has pagination built-in, so you can automatically generate the appropriate files and folders you need for paginated listings.

Enable pagination

To enable pagination for your blog, add a line to the `_config.yml` file that specifies how many items should be displayed per page:

source, yaml

paginate: 5


NOTE

*Pagination only works within HTML files.*

Pagination does not work with Markdown or Textile files in your Jekyll site. It will only work when used within HTML files. Since you’ll likely be using this for the list of Posts, this shouldn’t be an issue.

The number should be the maximum number of Posts you’d like to be displayed per- page in the generated site.

You may also specify where the destination of the pagination pages:

source, yaml

paginate_path: “blog/page:num”


This will read in `blog/index.html`, send it each pagination page in Liquid as `paginator` and write the output to `blog/page:num`, where `:num` is the pagination page number, starting with `2`. If a site has 12 posts and specifies `paginate: 5`, Jekyll will write `blog/index.html` with the first 5 posts, `blog/page2/index.html` with the next 5 posts and `blog/page3/index.html` with the last 2 posts into the destination directory.

Liquid Attributes Available

The pagination plugin exposes the `paginator` liquid object with the following attributes:

source, html

<div class=“mobile-side-scroller”> <table>

<thead>
  <tr>
    <th>Attribute</th>
    <th>Description</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td><p><code>page</code></p></td>
    <td><p>current page number</p></td>
  </tr>
  <tr>
    <td><p><code>per_page</code></p></td>
    <td><p>number of posts per page</p></td>
  </tr>
  <tr>
    <td><p><code>posts</code></p></td>
    <td><p>a list of posts for the current page</p></td>
  </tr>
  <tr>
    <td><p><code>total_posts</code></p></td>
    <td><p>total number of posts in the site</p></td>
  </tr>
  <tr>
    <td><p><code>total_pages</code></p></td>
    <td><p>number of pagination pages</p></td>
  </tr>
  <tr>
    <td><p><code>previous_page</code></p></td>
    <td>
        <p>
            page number of the previous pagination page,
            or <code>nil</code> if no previous page exists
        </p>
    </td>
  </tr>
  <tr>
    <td><p><code>previous_page_path</code></p></td>
    <td>
        <p>
            path of previous pagination page,
            or <code>nil</code> if no previous page exists
        </p>
    </td>
  </tr>
  <tr>
    <td><p><code>next_page</code></p></td>
    <td>
        <p>
            page number of the next pagination page,
            or <code>nil</code> if no subsequent page exists
        </p>
    </td>
  </tr>
  <tr>
    <td><p><code>next_page_path</code></p></td>
    <td>
        <p>
            path of next pagination page,
            or <code>nil</code> if no subsequent page exists
        </p>
    </td>
  </tr>
</tbody>

</table> </div>


NOTE

*Pagination does not support tags or categories.*

Pagination pages through every post in the posts variable regardless of variables defined in the YAML Front Matter of each. It does not currently allow paging over groups of posts linked by a common tag or category. It cannot include any collection of documents because it is restricted to posts.

Render the paginated Posts

The next thing you need to do is to actually display your posts in a list using the `paginator` variable that will now be available to you. You’ll probably want to do this in one of the main pages of your site. Here’s one example of a simple way of rendering paginated Posts in a HTML file:

source, html


layout: default title: My Blog


<!– This loops through the paginated posts –> {% for post in paginator.posts %}

<h1><a href="{{ post.url }}">{{ post.title }}</a></h1>
<p class="author">
  <span class="date">{{ post.date }}</span>
</p>
<div class="content">
  {{ post.content }}
</div>

{% endfor %}

<!– Pagination links –> <div class=“pagination”>

{% if paginator.previous_page %}
  <a href="/page{{ paginator.previous_page }}" class="previous">Previous</a>
{% else %}
  <span class="previous">Previous</span>
{% endif %}
<span class="page_number ">Page: {{ paginator.page }} of {{ paginator.total_pages }}</span>
{% if paginator.next_page %}
  <a href="/page{{ paginator.next_page }}" class="next">Next</a>
{% else %}
  <span class="next ">Next</span>
{% endif %}

</div>


WARNING

*Beware the page one edge-case.*

Jekyll does not generate a ‘page1’ folder, so the above code will not work when a /page1 link is produced. See below for a way to handle this if it’s a problem for you.

The following HTML snippet should handle page one, and render a list of each page with links to all but the current page.

source, html

{% if paginator.total_pages > 1 %}

<div class="pagination">
  {% if paginator.previous_page %}
    <a href="{{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}">&laquo; Prev</a>
  {% else %}
    <span>&laquo; Prev</span>
  {% endif %}

  {% for page in (1..paginator.total_pages) %}
    {% if page == paginator.page %}
      <em>{{ page }}</em>
    {% elsif page == 1 %}
      <a href="{{ '/index.html' | prepend: site.baseurl | replace: '//', '/' }}">{{ page }}</a>
    {% else %}
      <a href="{{ site.paginate_path | prepend: site.baseurl | replace: '//', '/' | replace: ':num', page }}">{{ page }}</a>
    {% endif %}
  {% endfor %}

  {% if paginator.next_page %}
    <a href="{{ paginator.next_page_path | prepend: site.baseurl | replace: '//', '/' }}">Next &raquo;</a>
  {% else %}
    <span>Next &raquo;</span>
  {% endif %}
</div>

{% endif %}