如何按作者分页

How to paginate posts by author

我想做什么

Jekyll 可以使用 tagscategories 之类的前端变量,并使用 site.tagssite.categories 访问它们以使用 liquid 迭代它们。 现在我的问题是我不能使用像 author(如 site.authors)这样的自定义前端变量来做到这一点,因为 Jekyll 不会以列表格式存储它。这使得它很难分页。

问题

我看过的每个解决方案,即

要求我将作者列表硬编码为_config.yml或其他.yml(即在_data/authors.yml中)。 这里的问题是我没有使用固定的作者列表。当我放入另一个带有前题标签 author: exampleAuthor 或作者列表的 post 时,作者列表需要更新(就像每个 post 的多个作者一样,目前只能使用categoriestags),而服务器是 运行。它非常适合标签和类别,但不适用于作者等自定义标签。

最简单的解决方案是有一个 site.authors 列表来迭代并使用 ruby 插件扩展它。

我还没有找到可以为我提供解决方案的插件,我认为这是一个常见问题,我可能不是第一个遇到这个问题的人。

我试过的

然后我考虑编写自己的 ruby 插件(由于缺乏文档,这本身就很难。也许我对 google 太笨了,但是我找到的资源其中非常有限且几乎不足以指导您完成整个过程)但必须有一个原因使得所有现有解决方案都需要在 .yml 中硬编码作者列表(或 .json,但大多数人出于某种原因选择 .yml

这样做对我来说是不可能的,因为我只想稍后在 post 中放入作者姓名并操纵 .yml (我的印象是.yml-服务器启动后文件不会被编译,例如 _config.yml,如果我错了请纠正我)会适得其反,因为它需要您重新启动服务器才能编译它们。

甚至像 jekyll-paginate-v2 (which I use successfully to paginate posts by tags and categories) don't have a solution to this, as shown by this issue 这样非常高级的插件。根据这个问题,建议滥用类别变量按作者分页。在我看来,这是一种绝望的解决方法,而且太老套了,无法考虑。

我发现建议也可以用集合来完成,但这又会 需要对作者列表进行硬编码(同样,我不想那样。我没有固定的作者列表。所有作者信息都必须来自前面- /_posts 目录中的 .md 个文件) 截至目前,我还不知道如何使用集合来完成。 但是我愿意接受建议。

编辑: 我发现这篇文章过时了 issue on Jekylls github page,它强调人们正在尝试做同样的事情但无济于事。 这在过去 4 年中变得可行了吗?

使用 collections 可以轻松地将作者添加到 Jekyll 帖子中。 Here's a proof of concept for you. Specifically, in 我添加你需要的一切。

As for your question about pagination,需要使用分页插件(paginate-v2 很好),因为我相信内置分页只支持帖子集合。

对于仍在寻找方法的人来说

  • 只需将 author: name 拖放到 post 前面即可自动生成作者页面,
  • 在作者页面上分页(一个很好的优化)。

我构建了一个插件 jekyll-auto-authors that works in sync with jekyll-paginate-v2 来启用作者自动页面和分页。

我写了 this guide and made this video 来帮助设置。

最低限度的设置说明:

安装插件:

group :jekyll_plugins do
  # other gems
  gem "jekyll-paginate-v2" # reqiured for jekyll-auto-authors to work
  gem "jekyll-auto-authors"
end

启用它:

plugins:
  # other plugins
  - jekyll-paginate-v2
  - jekyll-auto-authors

使用作者数据制作数据文件,例如使用 _data/authors.yml:

johndoe:
  name: "John Doe"
  bio: "John Doe is a software engineer."
  email: "john@example.com"
  socials:
    github: "john-doe"
    twitter: "john_doe"

janedoe:
  name: "Jane Doe"
  bio: "Jane Doe is a systems engineer."
  email: "jane@example.com"
  socials:
    github: "jane-doe"
    twitter: "jane_doe"

为作者页面做一个布局,比方说_layout/author.html。示例布局可以取自 the article.

_config.yml 文件中的作者启用分页和自动分页:

pagination:
  enabled: true
  per_page: 9
  permalink: '/page/:num/'
  title: ':title - page :num'
  sort_field: 'date'
  sort_reverse: true

autopages:
  enabled: true

  # enable auto pages for tags/categories/collections as per need. Disabling for this demo.
  tags:
    enabled: false
  categories:
    enabled: false
  collections:
    enabled: false

  authors:
    enabled: true # adding false here stops the auto-generation
    data: '_data/authors.yml' # Data file with the author details
    layouts: 
      - 'author.html' # We'll define this layout later, will be used for each author
    title: 'Posts by :author'
    permalink: '/author/:author/'
    slugify:
      mode: 'default' # choose from [raw, default, pretty, ascii or latin]
      cased: true # if true, the uppercase letters in slug will be converted to lowercase ones.

这是初始设置!

现在在 posts 的 front matter 中添加作者值:

---
# other configs
author: johndoe
---

这将生成在自动页面配置的 permalink 块中定义的页面。如果启用分页,并且超过 per_page 值,将以 /page/:num/ 格式生成额外的页面。

为了呈现作者值,插件公开了 page.pagination.author_data

{% assign author = page.pagination.author_data %}

<!-- Use {{ author.name }} or any such value, as defined inside the data file -->

要显示下一个和上一个按钮,您可以使用 paginator 公开的 this logic

{% if paginator.total_pages > 1 %}
<ul>
  {% if paginator.previous_page %}
  <li>
    <a href="{{ paginator.previous_page_path | prepend: site.baseurl }}">Newer</a>
  </li>
  {% endif %}
  {% if paginator.next_page %}
  <li>
    <a href="{{ paginator.next_page_path | prepend: site.baseurl }}">Older</a>
  </li>
  {% endif %}
</ul>
{% endif %}

初始设置非常繁琐,但一旦完成,您只需将作者数据放入 _data/authors.yml 文件并在 post frontmatter 中添加 author: value 就相当简单了!

P.S。我为 Genics Blog as managing multiple authors got hard. To learn how I've implemented it at Genics, please check out the theme-files 存储库开发了这个解决方案。

更新

我刚刚发布了v1.0.1,这使得在作者自动页面配置中添加data参数成为可选。

如果未定义数据,您仍然可以使用 page.pagination.author 访问作者用户名字符串。您可以使用它在页面上显示用户名。

如果定义了数据,page.pagination.author_data变量可用。这将是一个具有数据文件中定义的数据的哈希图。

这意味着您只需:

  • 添加并启用插件。
  • 设置分页和作者页面配置。
  • 制作布局文件。

您只需将 author: username 放入 post 文件即可为它们生成带分页的自动页!

我是一名高中生,我花了好几天时间来构建这个项目。请给 the project 打个星标并关注以表示支持:)