Pagination(ページ分け)
多くのWebサイト、特にブログでは、ポストのリストをいくつかの小さなリストに分けて、複数のページに分けて表示することは一般的です。Jekyllにはページ分けプラグインがあり、ページ区切り付きリストに適切なファイルとフォルダを自動的に生成できます。
Jekyll 3では、jekyll-paginate
プラグインが、Gemfileや_config.yml
のplugins
に含まれています。Jekyll 2ではスタンダードです。
ページ分けは、HTMLファイルでのみ働きます
ページ分けはJekyllサイトのMarkdownファイルでは機能しません。index.html
という名前のHTMLファイルで呼び出されたときのみ機能します。paginate_path
設定値でサブディレクトリ無いでページ分けを行うこともできます。
ページ分けの有効化
ブログでポストのページ分けを有効にするには、_config.yml
ふぁいるに1ページに何個のアイテムを表示するかの設定を追加します。
paginate: 5
数字は、生成したサイトで1ページに表示するポストの最大数です。
ページ分けしたページの出力先も指定できます。
paginate_path: "/blog/page:num/"
これでblog/index.html
を読み込み、paginator
としてLiquidのページ分けしたページを送り、blog/page:num/
に出力します。ここで:num
には2
から始まるページ番号が入ります。
paginate: 5
の設定で12個のポストをページ分けした場合、Jekyllはblog/index.html
には最初の5個、blog/page2/index.html
には次の5個、blog/page3/index.html
には最後の2個を出力します。
パーマリンクを設定しないでください
ブログページのfront matterにパーマリンクを設定すると、ページ分けが壊れます。パーマリンクは省いてください。
カテゴリやタグ、コレクションのページ分け
新しいjekyll-paginate-v2プラグインには更なる機能があります。 pagination examplesのリポジトリをご覧ください。このプラグインは、GitHub Pagesではサポートされていません。
利用可能なLiquid属性
ページ分けプラグインはpaginator
Liquidオブジェクト属性を利用できます。
変数 | 説明 |
---|---|
|
現在のページ番号 |
|
1ページに表示するポストの数 |
|
現在のページに表示されているポスト |
|
ポストの総数 |
|
ページの総数 |
|
前のページのページ番号。無い場合は |
|
前のページへのパス。無い場合は |
|
次のページのページ番号。無い場合は |
|
次のページへのパス。無い場合は |
Paginationはタグやカテゴリをサポートしていません
front matterでhidden: true
でないポストを除き、全てのposts
のポストがページ分けされたページに出力されます。現在のページ分けは、同じタグやカテゴリでグループを作る機能はありません。またポストに限定されるため、コレクションのドキュメントは含まれません。
ページ分けしたポストのレンダリング
次にpaginator
変数を使用してポストのリストを実際に表示する必要が出てくるでしょう。 おそらく、サイトのメインページで行いたいのでしょう。以下は、ページ分けされたポストを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="{{ paginator.previous_page_path }}" 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="{{ paginator.next_page_path }}" class="next">Next</a>
{% else %}
<span class="next ">Next</span>
{% endif %}
</div>
端のページに注意してください
Jekyllは‘page1’フォルダを生成しませんので、上記のコードは/page1
へのリンクが作成されたときには機能しません。これが問題でしたら、処理方法については下記をご覧ください。
次のHTMLはページ1を処理し、現在のページを除く全てのページへのリンクをレンダリングします。
{% if paginator.total_pages > 1 %}
<div class="pagination">
{% if paginator.previous_page %}
<a href="{{ paginator.previous_page_path | relative_url }}">« Prev</a>
{% else %}
<span>« Prev</span>
{% endif %}
{% for page in (1..paginator.total_pages) %}
{% if page == paginator.page %}
<em>{{ page }}</em>
{% elsif page == 1 %}
<a href="{{ paginator.previous_page_path | relative_url }}">{{ page }}</a>
{% else %}
<a href="{{ site.paginate_path | relative_url | replace: ':num', page }}">{{ page }}</a>
{% endif %}
{% endfor %}
{% if paginator.next_page %}
<a href="{{ paginator.next_page_path | relative_url }}">Next »</a>
{% else %}
<span>Next »</span>
{% endif %}
</div>
{% endif %}