Beginner's Guide for WordPress / Start your WordPress Blog in minutes

How to: Related Posts with Thumbnails in WordPress without Plugins

Do you want to display a list of related posts on your WordPress website and prefer to use code rather than a plugin?

When visitors to your blog have finished reading an article they are interested in, offering a list of related posts will keep them engaged and help them to find new content to read.

In this article, we will show you how to display related posts with WordPress using code, with no plugin required.

How to: Related Posts with Thumbnails in WordPress Without Plugins

Why Show Related Pages in WordPress?

When your WordPress blog starts to grow, it can become more difficult for users to find other posts on the same topic.

Displaying a list of related content at the end of each blog post is a great way of keeping your visitors on your website and increasing pageviews. It also helps improve the visibility of your most important pages by displaying your best content where people can easily find it.

If you’re not familiar with code, then you will find it simpler to choose one of the many WordPress related post plugins that can display related posts without code.

But if you’ve ever wondered whether you can display related posts without using a plugin, then we’ll share two different algorithms you can use to generate related posts with thumbnails using code alone:

Note: If you wish to show a thumbnail with each related post, then make sure you first add a featured image to those posts.

Method 1: How to Show Related Posts in WordPress by Tags

One efficient way to locate related content is to look for other posts that share the same tags. Tags are often used to focus on the specific details contained in a post.

With that in mind, you may wish to go ahead and add some common tags to the posts you want to relate to each other. You can enter them in the ‘Tags’ box in the WordPress editor.

The ‘Tags’ Settings Box in the WordPress Editor

After you have added tags to your posts, the next thing to do is to add the following code snippet to your theme’s single.php template. If you need help adding code to your site, then refer to our guide on how to add custom code in WordPress.

$orig_post = $post;
global $post;
$tags = wp_get_post_tags($post->ID);
if ($tags) {
$tag_ids = array();
foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;
$args=array(
'tag__in' => $tag_ids,
'post__not_in' => array($post->ID),
'posts_per_page'=>5, // Number of related posts that will be shown.
'ignore_sticky_posts'=>1
);
$my_query = new wp_query( $args );
if( $my_query->have_posts() ) {
  
echo '<div id="relatedposts"><h3>Related Posts</h3><ul>';
  
while( $my_query-&gt;have_posts() ) {
$my_query-&gt;the_post(); ?&gt;
  
<li><div class="relatedthumb"><a href="<?php the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>"><!--?php the_post_thumbnail(); ?--></a></div>
<div class="relatedcontent">
<h3><a href="<?php the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>"><!--?php the_title(); ?--></a></h3>
<!--?php the_time('M j, Y') ?-->
</div>
</li>
<!--?php }
echo '</ul--></ul></div>';
}
}
$post = $orig_post;
wp_reset_query();

This code looks for tags associated with a page and then runs a database query to fetch pages with similar tags.

Where should you place the code? That depends on your theme, but in most cases, you should be able to paste the code into your theme’s single.php template after the main post and right above the comments section.

If you are using the Twenty Twenty-One theme as we are on our demo site, then a good place to paste the code is in the template-parts/content/content-single.php file after the header and just after <?php the_content();.

Related Content by Tags Preview

This will automatically display related content on any WordPress post. You’ll need to change the styling and appearance of your related posts to match your theme by adding custom CSS.

Related Content by Tags Preview

Method 2: How to Show Related Posts in WordPress by Category

Another way to display related content is to list posts that are in the same category. The advantage of this method is that the list of related posts will almost never be blank.

Like Method 1, you need to add a code snippet to your theme’s single.php template. For more details, refer to Method 1 and our guide on how to add custom code in WordPress.

$orig_post = $post;
global $post;
$categories = get_the_category($post-&gt;ID);
if ($categories) {
$category_ids = array();
foreach($categories as $individual_category) $category_ids[] = $individual_category-&gt;term_id;
$args=array(
'category__in' =&gt; $category_ids,
'post__not_in' =&gt; array($post-&gt;ID),
'posts_per_page'=&gt; 2, // Number of related posts that will be shown.
'ignore_sticky_posts'=&gt;1
);
$my_query = new wp_query( $args );
if( $my_query-&gt;have_posts() ) {
echo '<div id="related_posts"><h3>Related Posts</h3><ul>';
while( $my_query-&gt;have_posts() ) {
$my_query-&gt;the_post();?&gt;
  
<li><div class="relatedthumb"><a href="<?php the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>"><!--?php the_post_thumbnail(); ?--></a></div>
<div class="relatedcontent">
<h3><a href="<?php the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>"><!--?php the_title(); ?--></a></h3>
<!--?php the_time('M j, Y') ?-->
</div>
</li>
<!--?php }
echo '</ul--></ul></div>';
}
}
$post = $orig_post;
wp_reset_query();

Now you will see a list of related content at the bottom of each post.

If you want to change the styling and appearance of your related pages, then you will need to add custom CSS to match your theme.

We hope this tutorial helped you learn how to display related posts with thumbnails in WordPress without plugins.

You may also want to learn how to track visitors to your WordPress site, or check out our list of 24 tips to speed up your website.

If you liked this article, then please subscribe to our YouTube Channel for WordPress video tutorials. You can also find us on Twitter and Facebook.

Disclosure: Our content is reader-supported. This means if you click on some of our links, then we may earn a commission. See how WPBeginner is funded, why it matters, and how you can support us.

The Ultimate WordPress Toolkit

Get FREE access to our toolkit – a collection of WordPress related products and resources that every professional should have!

Reader Interactions

180 CommentsLeave a Reply

  1. Hi,

    I have a ‘Related post’ option from my wordpress theme and i am already using it. I have displayed 6 posts after the content. The problem is, it only shows 3 related posts and next three can be seen when you slide it horizontally. I don’t want that option, i want the site to display all 6 posts outright. Can you tell me how to do it?

  2. Hello,

    Your guidance was amazing but how can i exclude a specific category from the related posts in order to not display it?

    Thank you, in advance!
    Sincerely,
    LAszlo Gyuricza

  3. Nice solution but not definitive for my exigence. Infact the mean problem is that this code sort the related posts from the most recent in the same category or tags. The result is that when you browse inside a category/tag you’ll always display the same few last posts, limiting hardly the older posts of your site. That’s a right conclusion? Please if you tried it share your opinion!

    • 1. After ‘caller_get_posts’=>1 put a comma(,)
      2. Hit enter button [next line]
      3. Add ‘orderby’=>’rand’
      You are done. Now related posts will be shown randomly. Thank you.

  4. This code works great. I was wondering if you could explain what this part of the code does?

    $orig_post = $post;
    global $post;

    $post = $orig_post;

    I think I have a grasp on what the rest is doing, but this is throwing me for a loop.

    Thanks for all your great content!

  5. in Twentyfifteen default theme where should i insert this code in single.php file? If i inserted above the endwhile; it shows syntax error, unexpected ‘endwhile’ and if i inserted below the endwhile; but above the endif; it shows syntax error, unexpected ‘endif’

    Any solution for this?

    Thanks

  6. in Twentyfifteen default theme where should i insert this code in single.php file? If i inserted above the enwhile; it shows syntax error, unexpected ‘endwhile’ and if i inserted below the enwwile but above the endif; it shows syntax error, unexpected ‘endif’

    Any solution for this?

    Thanks

  7. Hi! Great post!

    Is there a way to combine both option, in order to call related tags only in the current category ?

  8. my single.php layout :

    //the_content bla bla bla code here

    //Copy paste Related Posts by Tags code here

    //comments_template bla bla bla code here

    ——————————-
    the result i got error :
    Parse error: syntax error, unexpected ‘endwhile’ (T_ENDWHILE) in …
    ——————————-
    after i change ” <? } " to " <?php } " it worked,

    just sugestion, maybe it better if you put complete php open tag
    thanks :)

  9. Works perfect. How to exclude the definite tag from Related Posts by Tags? I mean how to change the code when algorithm would find other posts with any one of the tag (except tag 595 for instance) that the current post has and will list them.

  10. Thanks for the great code
    It works great but you didn’t address any css codes for a more beautiful look for this section. Can you please do this? I’m newbie to coding and I tried some codes but they didn’t work. In your codes there is:
    echo ‘Related Posts’;
    but in some similar codes I found in other resources there is:

    and in css some codes like this:
    .relatedposts {
    font-size: 12px;
    width: 640px;
    }
    .relatedposts h3 {
    font-size: 20px;
    margin: 0 0 5px;
    }
    will get that a nice look but it didn’t work with your code.
    Thanks

  11. Dear collegue this is an error am getting while pasting this code on single.php file.kindly tell me exacctly where should i paste this code.

    Parse error: syntax error, unexpected end of file in C:\xampp\htdocs\beingusefull\wp-content\themes\TechPlus\single.php on line 78

  12. That will depend on your individual theme and template. You need to add the conditional tag after the WordPress loop begins. After this line:
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

    • I got that error too and this is my updated code:
      ID);
      if ($tags) {
      $tag_ids = array();
      foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;
      $args=array(
      ‘tag__in’ => $tag_ids,
      ‘post__not_in’ => array($post->ID),
      ‘posts_per_page’=>5, // Number of related posts that will be shown.
      ‘caller_get_posts’=>1
      );
      $my_query = new wp_query( $args );
      if( $my_query->have_posts() ) { ?>
      Related Posts
      have_posts() ) : $my_query->the_post(); ?>
      <a href="” rel=”bookmark” title=””>

      <a href="” rel=”bookmark” title=””>

    • If you’re using Yoast’s WordPress SEO plugin you can specify the thumbnail URL under the social tab for the post. If the social tab isn’t shown then you need to click the Yoast SEO link in the WordPress admin menu then click “Social”. In the social page tick the option for, “Add Open Graph meta data” and save. Go back into your post and you can specify the thumbnail image you want to use when the post is shared. If you don’t implicitly set the post image the user has the option of selecting any image that appears on the page, which is why your recent post images are being pulled in when you share the article link.

  13. Any thoughts on how much of a database/server load this would be on a large self-hosted site? Looking for a related posts alternative now that #nRelate is no longer available.

  14. This doesn’t work in the single.php for me, b/c related posts show up at the very bottom of the page. It works with loop.php but then they also show up on the homepage – any ideas on a fix so it just shows in single posts and not the homepage?

  15. Hi, I must be the only one who is not doing this correctly. My theme supports featured images, I added this code before the comments within the single.php file. Any tips on exactly where to input in the code?

  16. Is there a way to add pagination to the related posts query? I cant seem to get pagination to work on a secondary query within single.php. Thanks!

  17. Hello , i want to ask , is there way to make , that related posts would be by category and tags in one place? Thanks.

  18. Is there a way to choose a single category (let’s call it Brands) and then have it display related posts only affiliated with the child categories under Brands? So, the hierarchy for the cats would be Brands > JCPenny. I want to only show related posts for JCPenny. But, that child category could be different per post. So if a post uses a different child category it’ll show related posts for that child cat. Can this code be modified to handle that somehow?

  19. Hi, thanks for the code, but instead of grabbing the featured image as a thumb, can i grab instead the first image in my posts? Thanks

      • It would be great if you guys would make a post on it. Thank you very much and will be waiting. Hope that you can kindly post here a notification once you made the post so we know.

  20. Great post thanks! I run a website that uses WP more as a CMS with a large number of pages rather than posts. Can I do this with as related pages instead, so that it’s grabbing related pages and not posts? If so how do I go about doing this.

    Thanks for the help :)

  21. This. Is. Awesome. WPEngine understandably doesn’t allow for related posts plugins, save for a few exceptions. I tried a few and really didn’t like them. I threw this code into single.php and voila! Thank you.

  22. This is good, but i wanna do it with title of post rather then tags or category. Any suggestions for it, syed!!

  23. Hi friends little problem it appears to me: “Parse error: syntax error, unexpected ‘endwhile’ (T_ENDWHILE) in C: \ xampp \ htdocs \ z1 \ wp-content \ themes \ mytheme \ single.php on line 65” find
    But what ..? Thanks

  24. Love this piece of code, use it on the regular! One question: Is there a way to exclude some tags in the code?

  25. Take a look at the category related posts code. It wont work unless you add some php , the three letters before getting started with echo. Add php and it will not be ignored. In either case, it is ignored and wordpress cries every time with an error note. Thanks for the code by the way and it made my work a lot easier. Thanks a ton for that and do adjust it ,

  26. Also, I have one more question,

    What if I wanted to display a certain post containing a certain tag to all posts, how would I do this?

  27. Hi, this is so awesome! Now I can just get rid of my related post plugin, so thanks A LOT for that!

    One question I have is, how can I display the related post in 2 column?

    Once again, this has been such a BIG help for me!

  28. Hi!! Thanks for your helpful information for those, like myself, who have no idea of any coding, but still want to have a blog!! I have just incorporated your ‘relate posts by tags” code to my single post file. It works except for the pfotos. They dont show at all and the titles of my related posts are shown the one under the other, like a list. What have I done wrong?? Thanks in advance for your answer!!

  29. Hi,

    This code is amazing! Thank you so much. Is there a way I can make the code show related posts from ANOTHER SITE? So it searches the posts from another site that I show below the post as a related post on my site?

    Thanks!

  30. Hi,
    I’m using a theme that works with custom posts. I wonder if I try your code, which part should I edit to display just those custom posts instead of the regular posts.

    Thanks

  31. Hello – yours is the first tutorial that I found that works but I would like the list vertical. Can you give an example of the CSS for that?

  32. Hey,

    I cannot, find the single.php where I have to insert this code.

    The problem is that I am using Balance Theme + Genesis. So in the genesis, I can find the Single.php, but it says to “Not Edit Under Any Circumstances”, and I have actually pasted the code in there, but it made my site to stop opening pages at all.
    And in the Child Balance Theme, there is no Single.php ….

    Any suggestions?

    • Yes, don’t edit the framework file. You would have to familiarize yourself with Genesis hooks and filters. Then add the code in one of the loop hooks for single page using your functions.php file. Unfortunately, due to the amount of frameworks out there, we can’t possibly cover our tips for all frameworks.

      Admin

  33. Hello is there any way to change the thumbnail size? i get only one related post and its thumbnail is huge

  34. Hi! this is very useful coding. Is it possible to use this for making a custom page that will show all the posts, like a sitemap but with thumbnails? Something like this:

    Category 1
    —– related posts code (all posts from that category) ——

    Category 2
    —– related posts code (all posts from that category) ——

    etc. It would make a great showcase for categories with few posts. Thank you for reading and help!

  35. Hey,

    very handy your “Related Posts by Category”.

    Sometimes I believe it’s better to have add a raw code rather than use a plugin doesn’t is so expansible…

    Thank you!

  36. Thank you thank you thank you!! A simple copy paste bit of code that just gets on with it and works – does exactly what it says. This is exactly what I was looking for :)

  37. hi!

    i need some help…

    How i can filter.. the category, but if i have parent and child categories and only i show the child post. ex:

    – product (all product, this is the parent) (id 104)

    – KindOfProducts (subcategory, this is the child) (id 109)

    – KindOfProductsTwo (subcategory, this is the child) (id 110)

    in products have all post but just need show related from the child: KindOfProducts.

    i try whit this:

    $args = array(

    ‘category__in’ => $category_ids,

    ‘category__not_in’ => 104,

    ‘post__not_in’ => array($post->ID),

    ‘orderby’=> ‘rand’,

    ‘showposts’ => 100,

    ‘ignore_sticky_posts’ => 1

    );

    but dont showme nothing…

    and i try whit this other one:

    $args = array(

    ‘category__in’ => $category_ids,

    ‘child_of’ => 104,

    ‘post__not_in’ => array($post->ID),

    ‘orderby’=> ‘rand’,

    ‘showposts’ => 100,

    ‘ignore_sticky_posts’ => 1

    );

    and nothing

    help? tnks!

Leave A Reply

Thanks for choosing to leave a comment. Please keep in mind that all comments are moderated according to our comment policy, and your email address will NOT be published. Please Do NOT use keywords in the name field. Let's have a personal and meaningful conversation.