I am seeing the same 3 related posts on most every post I make. Tags with 2 or 3 matches are ignored for 1 match items. Is this a known issue?
That section is provided by the theme. Most themes pull anything with a tag that matches. Do you have a lot of posts with duplicate tags? You could edit the theme to use the primary tag insteadā¦
Oh interesting. I thought the theme was just pulling a built in related feature from ghost. I do have lots that have duplicate tags, but I thought i read it would pull more similar tags first, which would be a better result for me. I will contact the theme author.
Yeah, it varies. Most themes that do related posts have that code in partials/related.hbs or partials/related.hbs.
For instance, hereās how Ruby does it:
<div class="related-wrapper gh-outer">
{{#get "posts" limit="4" filter="tags:[{{post.tags}}]+id:-{{post.id}}" include="tags,authors" as |related|}}
...rest excerpted...
So it excludes the current post, but grabs the first four posts (most recent, since order isnāt specified) with a tag in the group of tags that the current post has. Works great if your tags are mostly orthogonal, badly if all your tags are tagged āblogā. Edge and Headline and a number of other themes do the same thing.
Alto does it like this:
{{#get "posts" limit="3" filter="tag:{{primary_tag.slug}}+id:-{{id}}" include="tags" as |related|}}{{#if related}}
<section class="related-posts gh-canvas">
... rest excerpted...
Notice that the #get uses primary tag, so if you have posts where the most important tag is first, youāre likely to get better related posts if you search that way.
If you play with that #get, you can tweak behavior in any theme. You could also add an order parameter, if you donāt want the 3-4 most recent matches to the tag criterion. Or it might make sense to filter by author, for some sites.
Ideally, I would like a random selection of posts that match the most tags. My site is a travel blog for my family. I have 3 primary tags: trips, wildlife, automotive. Each continent has its own tag, followed by country, and finally and specific tags for that post. An example of my problem is that I have two posts that have the tags in the following order: Middle East, Qatar, Trips; and Middle East, Jordan, Trips. When I view either of these posts, I only get the newest posts from the Trips tag.
My related posts code in partials is {{#get āpostsā limit=ā3ā include=ātagsā filter=ātags:[{{post.tags}}]+id:-{{post.id}}ā as |related-posts|}}
Hmm. Tricky. So hereās how youād have to do it, I think. (Code not tested, almost certainly has a bug/formatting issue.)
{{#get 'tags' filter="tags:[{{post.tags}}]+tags:-[trips,wildlife,automotive,etc]+visibility:public"
limit="1" include="count.posts" order="count.posts asc as |reltags|"
}}
{{#foreach reltags}}
{{#get 'posts' filter="tags:[{{slug}}]-id:{{../../{{id}} limit="3"}}
-- do some stuff with the related posts here --
{{/get}}
{{/foreach}}
{{/get}}
So the approach there is to get your most RARE tags on each post, then retrieve other posts with that rarest tag. (Iām assuming that you have no tags applied to fewer than the number of related posts you want. You could instead get your two rarest tags, if your second rarest tag isnāt sometimes super commonā¦)
Thanks, I will try it out this weekend and see how it goes
So, I am not sure how to exactly implement your code into my partials for my theme. Here is the code that I currently have in the page.
{{#get 'posts' limit='3' include='tags' filter='tags:[{{post.tags}}]+id:-{{post.id}}' as |related-posts|}}
{{#if related-posts}}
<hr>
<div class='c-related'>
<div class='o-grid'>
<div class='o-grid__col o-grid__col--full'>
<div class='c-title-bar'>
<h3 class='c-title-bar__title'>{{t 'You might also like' }}</h3>
</div>
</div>
{{> loop }}
</div>
</div>
{{/if}}
{{/get}}
I agree that it seems like Ghost should try to match a maximal number of tags when looking for related posts. This feels like it should be another built-in Handlebars templating helper that Ghost provides.
One workaround Iāve used is to simply have fewer tags. For example, if āTripsā and āMiddle Eastā were combined to a single āTrips: Middle Eastā tag, then related posts all at least to the same part of the world.