Working With Ghost Authors / Practical Examples to Use in Your Theme
I discussed how the Ghost Author Context works in the latest post. This practical post will show how to work with Ghost Author API. I will show examples of displaying all the website authors, show-specific authors, exclude some and more cases to use in your Ghost theme.
I will use the Ghost #get
block helper to make custom queries to the Ghost API to get the author’s data.
Show All Authors
Let’s start with a basic example to show all the website authors.
{{#get 'authors' limit='all'}}
{{#foreach authors}}
{{ name }}
{{/foreach}}
{{/get}}
We have used the limit
attribute with the all
value to specify how many authors we want in return. In this case, we passed the all
value to get all authors.
The default value of the limit
attribute is 15
. In addition to the all
value, we can pass a number; for example, if we want to get five authors, we can use limit='5'
.
{{#get 'authors' limit='5'}}
{{#foreach authors}}
{{ name }}
{{/foreach}}
{{/get}}
In addition to the #get
block helper, I used the foreach
, loop helper, to iterate over the data one by one and then output the author content inside its opening and closing tags {{#foreach}}{{/foreach}}
.
The final result of the previous example will be.
Ahmad Ajmi
William James
Emily James
Jeff Rosenberger
Olivia Thomas
As you can see, the only date we get so far is the author name using the {{#foreach}}{{ name }}
attribute. Let’s see how we can make the author name clickable to go to the author page when clicking on it.
The following example will output all the author as an HTML unordered list.
{{#get 'authors' limit='5'}}
{{#foreach authors}}
<a href='{{ url }}'>{{ name }}</a>
{{/foreach}}
{{/get}}
Here, I used the {{#foreach}}{{ url }}
attribute, which will output the author URL within an HTML link tag.
The result will be.
<a href="/author/ahmad/">Ahmad Ajmi</a>
<a href="/author/william/">William James</a>
<a href="/author/emily/">Emily James</a>
<a href="/author/jeff/">Jeff Rosenberger</a>
<a href="/author/olivia/">Olivia Thomas</a>
For the list of the available attributes, check Author object attributes.
To create a custom authors page, read my Create an Authors Page post.
Show Specific Authors
To show only a specific author, use the filter
attribute and pass the Slug of each tag you want to get.
You can find the tag Slug on the tag setting page.
In this case, the basic syntax for the #get
block helper is.
{{#get 'authors' filter='slug:[SLUG, SLUG, SLUG]'}}
Note the Comma (,
) separating each slug.
If we want to get the authors with the ahmad, eiad and adham slugs, the previous example will be like.
{{#get 'authors' filter='slug:[ahmad, eiad, adham]'}}
{{#foreach authors}}
<a href='{{ url }}'>{{ name }}</a>
{{/foreach}}
{{/get}}
Note
This way does not guarantee getting the same authors in the same order as you added the slugs. Probably a Ghost issue. Instead, use the following method.
In this method, we get each author separately. For example, to get the author with ahmad
and eiad
slugs.
{{#get 'authors' filter='slug:ahmad'}}
{{#foreach authors}}
<a href='{{ url }}'>{{ name }}</a>
{{/foreach}}
{{/get}}
{{#get 'authors' filter='slug:eiad'}}
{{#foreach authors}}
<a href='{{ url }}'>{{ name }}</a>
{{/foreach}}
{{/get}}
I removed the [ ]
around the slug as we are only filtering with one slug.
Exclude Authors
Suppose you want to show all authors except a few ones. For example, you want to show all the website authors but the authors with ahmad and eiad slugs.
In this case, the basic syntax for the #authors
helper is.
{{#get 'authors' filter='slug:-[SLUG, SLUG, SLUG]'}}
The difference from the previous example is the -
sign in the filter
attribute before the slugs. Note the following example.
{{#get 'authors' filter='slug:-[ahmad, eiad]'}}
{{#foreach authors}}
<a href='{{ url }}'>{{ name }}</a>
{{/foreach}}
{{/get}}
Show Post Count
Another practical example is to show the post count for each author. Use the include
attribute and pass the count.posts
as a value. Let’s see, we want to show five authors and how many posts each one has.
{{#get 'authors' limit='5' include='count.posts'}}
{{#foreach authors}}
<a href='{{ url }}'>{{ name }} ({{ count.posts }})</a>
{{/foreach}}
{{/get}}
The result will be.
<a href="/author/ahmad/">Ahmad Ajmi (4)</a>
<a href="/author/william/">William James (3)</a>
<a href="/author/emily/">Emily James (2)</a>
<a href="/author/jeff/">Jeff Rosenberger (6)</a>
<a href="/author/olivia/">Olivia Thomas (8)</a>
We can also order the authors by their post count. In the following example, I used the order
attribute to order by the count.posts
we used before in the include
attribute.
{{#get 'authors' limit='5' include='count.posts' order='count.posts desc'}}
{{#foreach authors}}
<a href='{{ url }}'>{{ name }} ({{ count.posts }})</a>
{{/foreach}}
{{/get}}
The result will be.
<a href="/author/olivia/">Olivia Thomas (8)</a>
<a href="/author/jeff/">Jeff Rosenberger (6)</a>
<a href="/author/ahmad/">Ahmad Ajmi (4)</a>
<a href="/author/william/">William James (3)</a>
<a href="/author/emily/">Emily James (2)</a>
Show Posts for Each Author
Let’s take a more complex example. Suppose we want to list five authors ordered by how many posts they have and show their posts under each.
{{#get 'authors' limit='5' include='count.posts' order='count.posts desc'}}
{{#foreach authors}}
<h4><a href='{{ url }}'>{{ name }}</a></h4>
{{#get 'posts' filter='primary_author:{{slug}}' limit='3'}}
<ul>
{{#foreach posts}}
<li><a href='{{ url }}'>{{ title }}</a></li>
{{/foreach}}
</ul>
{{/get}}
{{/foreach}}
{{/get}}
I added a new #get
block helper starting from line five inside the foreach
helper to get the posts associated with each author filtered by his slug.
I also set the limit to three posts, but you are free to customize this.
For example, if the author slug is ahmad
, I’m asking Ghost to get the posts associated with him using the filter
attribute and pass the {{slug}}
as a value to primary_author
. The {{slug}}
is already available for each author as a data value like name and image, and in this case, it will be rendered as ahmad
.
So, the code for the posts helper will be interpreted as follows.
{{#get 'posts' filter='primary_author:ahmad' limit='3'}}
{{#foreach posts}}
<li><a href='{{ url }}'>{{ title }}</a></li>
{{/foreach}}
{{/get}}
This will happen for each author within the loop. The result will look like the following example. Each author and their posts are underneath.
<h4><a href="/author/eiad/">Jeff Rosenberger</a></h4>
<ul>
<li><a href="/a-rich-life/">A Rich Life with Less Stuff</a></li>
<li><a href="/it-would-be/">The Rappers Who Are Breaking Up</a></li>
<li><a href="/themes/">Expertise Is Falling Out of Favor</a></li>
</ul>
<h4><a href="/author/ahmad/">Ahmad Ajmi</a></h4>
<ul>
<li><a href="/travel/">Travel Is No Cure for the Rediverge</a></li>
<li><a href="/my-ultimate-reading/">My Ultimate Reading List</a></li>
<li><a href="/untitled/">10 Trends for Creators to Watch in 2021</a></li>
</ul>
<h4><a href="/author/adham/">Olivia Thomas</a></h4>
<ul>
<li><a href="/organising/">How to Get More Out of Your Performance</a></li>
<li><a href="/ghost-publishing/">Will John Roberts Constrain Trump?</a></li>
<li><a href="/days-of-wine/">The Film That You Might Not Hear About</a></li>
</ul>
<h4><a href="/author/sara/">Sara James</a></h4>
<ul>
<li><a href="/managing-ghost/">How to Think About the Plummeting Stock</a></li>
<li><a href="/the-new-rules/">The New Rules of Personal Finance</a></li>
<li><a href="/eddie-kim-somehow-/">Eddie Kim somehow managed</a></li>
</ul>
That’s all that I wanted to share today, and I hope you find this post helpful.