Jekyll can use front matter variables like tags
and categories
and access them with site.tags
and site.categories
to iterate over them using liquid.
Now my problem is that I can't do this with a custom front matter variable like author
(as in site.authors
) because Jekyll will not store it in a list format. This makes it very hard to paginate it.
Every solution I have looked at i.e.
requires me to hardcode a list of authors to _config.yml
or some other .yml
(i.e. in _data/authors.yml
).
The problem here is that I don't use a fixed list of authors. The authors list needs to get updated when I throw in another post with a front-matter tag author: exampleAuthor
or a list of authors (as in multiple authors per post, as currently only possible with categories
and tags
as well), while the server is running. It works with tags and categories splendidly, but not with custom tags like authors.
The easiest solution would to have a site.authors
list to iterate over and just extending it with a ruby plugin.
I haven't found a plugin that provides me with a solution and thinking this was a common problem that I'm probably not the first to have.
I then looked at writing my own ruby plugin (Which is hard on it's own because of the lack of documentation. Maybe I'm to dumb to google, but the resources I found where very limited and hardly enough to guide you through the process) but there has to be a reason why this is so hard to do that makes all the existing solutions require hard-coding the author list in a .yml
(or .json
, but most people go with .yml
for some reason).
Doing this is out of the question for me, since I want to only throw in posts with author names in it later on and manipulating a .yml
(I am under the impression that .yml
-files don't get compiled once the server is started, like _config.yml
, correct me if I'm wrong) would be counterproductive because it requires you to restart the server to have them compiled.
Even very advanced plugins like 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. As per this issue, it is getting recommended to misuse the category variable to paginate by author. In my opinion, that is desperate workaround and too hacky to be considered.
I have found suggestions that it could also be done with collections, but this would again
requiring to hard-coding the author list (again, I don't want that. I don't have a fixed list of authors. All of the author information has to come from the front-matter in the /_posts
directory .md
files)
As of now I don't see how it can be done with collections.
However I'm open to suggestions.
Edit: I found this dated issue on Jekylls github page which highlights that people are trying to do the same but to no avail. Has this become viable in the last 4 years?
For someone still looking for a way to
author: name
to post front matter,I built a plugin jekyll-auto-authors
that works in sync with jekyll-paginate-v2
to enable author auto pages along with pagination.
I wrote this guide and made this video to help with the setup.
The bare minimum setup instructions:
Install the plugin:
group :jekyll_plugins do
# other gems
gem "jekyll-paginate-v2" # reqiured for jekyll-auto-authors to work
gem "jekyll-auto-authors"
end
Enable it:
plugins:
# other plugins
- jekyll-paginate-v2
- jekyll-auto-authors
Make a data file with author data, for example using _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"
Make a layout for the author page, let's say _layout/author.html
. Example layout can be taken from the article.
Enable pagination and auto pages for authors in _config.yml
file:
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.
That's the initial setup!
Now drop in the author value in the front matter of posts:
---
# other configs
author: johndoe
---
This will generate a page as defined in the permalink
block of the auto pages configuration. If there's pagination enabled, and per_page
value is exceeded, the additional pages will be generated in /page/:num/
format.
To render the author values, the plugin exposes page.pagination.author_data
value
{% assign author = page.pagination.author_data %}
<!-- Use {{ author.name }} or any such value, as defined inside the data file -->
To show next and previous buttons, you can use this logic that paginator
exposes:
{% 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 %}
The initial setup is overwhelming, but once done you can then just drop in author data inside _data/authors.yml
file and add author: value
inside post frontmatter and it is fairly easy then!
P.S. I developed this solution for Genics Blog as managing multiple authors got hard. To learn how I've implemented it at Genics, please check out the theme-files repository.
I released v1.0.1
just now, which makes adding the data
parameter to author autopage configuration optional.
If data isn't defined, you can still access the author username string with page.pagination.author
. You can use it to show the username on the page.
If data is defined, page.pagination.author_data
variable is available. This would be a hashmap that has data as defined in the data file.
This means that you just have to:
And you can just drop in author: username
to post files to generate autopages for them with pagination!