分页

对于许多网站(尤其是博客),将文章的主要列表分成更小的列表并在多页上显示非常常见。Jekyll 提供分页插件,以便您可以自动生成分页列表所需的适当文件和文件夹。

对于 Jekyll 3 或更高版本,在 Gemfile 和 _config.yml 中的 plugins 下包含 jekyll-paginate 插件。对于 Jekyll 2,这是标准配置。

分页仅在 HTML 文件中有效

分页无法在 Jekyll 网站的 Markdown 文件中使用。分页在从名为 index.html 的 HTML 文件中调用时有效,该文件可以选择驻留在子目录中并通过 paginate_path 配置值从中生成分页。

启用分页

要为博客上的文章启用分页,请向 _config.yml 文件添加一行,指定每页应显示多少项

paginate: 5

该数字应为要在生成网站中每页显示的最大文章数。

您还可以指定分页页面的目标

paginate_path: "/blog/page:num/"

这将读取 blog/index.html,将其作为 paginator 在 Liquid 中发送到每个分页页面,并将输出写入 blog/page:num/,其中 :num 是分页页码,从 2 开始。
如果一个站点有 12 篇帖子并指定 paginate: 5,Jekyll 将写入 blog/index.html,其中包含前 5 篇帖子,blog/page2/index.html,其中包含接下来的 5 篇帖子,以及 blog/page3/index.html,其中包含最后 2 篇帖子,并将其写入目标目录。

不要设置永久链接

在博客页面的前端设置永久链接将导致分页中断。只需省略永久链接即可。

类别、标签和集合的分页

较新的 jekyll-paginate-v2 插件支持更多功能。请参阅存储库中的 分页示例GitHub Pages 不支持此插件

可用的 Liquid 属性

分页插件公开了 paginator liquid 对象,其中包含以下属性

变量 说明

paginator.page

当前页面的页码

paginator.per_page

每页的帖子数

paginator.posts

当前页面的可用帖子

paginator.total_posts

帖子的总数

paginator.total_pages

页面的总数

paginator.previous_page

上一页的页码,如果不存在上一页,则为 nil

paginator.previous_page_path

上一页的路径,如果不存在上一页,则为 nil

paginator.next_page

下一页的页码,如果不存在下一页,则为 nil

paginator.next_page_path

下一页的路径,如果不存在下一页,则为 nil

分页不支持标签或类别

分页页面会遍历 posts 变量中的每篇帖子,除非帖子的前端设置中包含 hidden: true。它目前不允许对通过共同的标签或类别链接的帖子组进行分页。它不能包含任何文档集合,因为它仅限于帖子。

渲染分页帖子

接下来你需要做的是使用现在可以使用的 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 代码段应处理第一页,并呈现每页的列表,其中包含指向除当前页之外所有页面的链接。

{% if paginator.total_pages > 1 %}
<div class="pagination">
  {% if paginator.previous_page %}
    <a href="{{ paginator.previous_page_path | relative_url }}">&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="{{ '/' | 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 &raquo;</a>
  {% else %}
    <span>Next &raquo;</span>
  {% endif %}
</div>
{% endif %}