Bin-Blog logoBin-Blog

Learn about the latest in Web Development – as soon as I do.

Show Related Post in WordPress Without a Plugin

By • Apr 17th, 2009 • Category: PHP, Scripts, WordPress

WordPress Metal Logo

Related posts is a very popular feature. My default wordpress installation often includes a plugin that has this functionality. There are quite a few plugins that lets you have this feature…

The Code

WordPress has been supporting tags in its new released – so the related posts feature can be implemented without the help of any plugins. All we have to do is find the other posts with some same tags as the current post. Just open the single.php file in your theme and add this bit of code where you want the related posts to show up…

<?php
$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),
		'showposts'=>5, // Number of related posts that will be shown.
		'caller_get_posts'=>1
	);
	$my_query = new wp_query($args);
	if( $my_query->have_posts() ) {
		echo '<h3>Related Posts</h3><ul>';
		while ($my_query->have_posts()) {
			$my_query->the_post();
		?>
			<li><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
		<?php
		}
		echo '</ul>';
	}
}
?>

This code finds the other post with any one of the tag that the current post has. If you want to show the posts with any one of the categories that the current post has, use this code instead…

<?php
$categories = get_the_category($post->ID);
if ($categories) {
	$category_ids = array();
	foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id;
	
	$args=array(
		'category__in' => $category_ids,
		'post__not_in' => array($post->ID),
		'showposts'=>5, // Number of related posts that will be shown.
		'caller_get_posts'=>1
	);
	// Rest is the same as the previous code

WordPress Plugin Killer Series

For those who came in late, this post is part of the WordPress Plugin Killer Series. This series will show you how to duplicate the functionality of the a few wordpress plugins without having to install it using custom code in the wordpress theme. The previous posts in this series are…

More Resources


114 Responses »

  1. [...] Show Related Post in WordPress Without a Plugin – Related posts is a very popular feature. My default wordpress installation often includes a plugin that has this functionality. There are q… [...]

  2. looks like I have some reading to do. I like the idea, So I had better read the whole killer series.
    Thanks

  3. Ted Heich says:

    Thanks for this Binny, this will save me a lot of time. Good post.

  4. Marian says:

    I implemented the script for catehories but I have a problem. I now get the comments from all the articles (including those recommended).

    Here’s an example: http://www.artistick.ro/concepte/deseneaza-in-3d-cu-wacom-vision-1336#more-1336

  5. V.C says:

    I found this topic when I was looking for some ways to display related posts.
    Could you please tell me how can I display Recent Post on Homepage?

  6. Linda says:

    I had trouble with my related posts plugin. This is an easy and effective solution. I don’t have much experience with php etc but I was able to figure out where to put the code and it looks great.

    Thanks for sharing this!

  7. dlv says:

    if someone has problem with comments using this script
    http://www.3mind.at/2009/05/06/code-highlighting/ found the solution.

    We have to use in the beggining:

    $backup = $post;

    and in the end:

    $post = $backup;
    wp_reset_query();

    i hope to help someone
    good bye
    adeux!

  8. [...] what I needed until I found this helpful tutorial, entitled Show Related Post in WordPress Without a Plugin by Binny V A. He provides a solution for both tags and categories, which is perfect. (In fact, this [...]

  9. jocuri noi says:

    good job, i tested and is working perfectly, thank you

  10. help me plz says:

    sir, in my theme there is no single.php, what i have to do

  11. thank you! That’s exactly what I was looking for and it worked beautifully!

  12. [...] Esta dica está presente em um monte de blogs, mas para este post, consultei o Bin Blog. [...]

  13. Great code. Thanks a bunch.

  14. mores says:

    Any ideas how to get category__in and tag__in to co-exist?

  15. mores says:

    Hmm, I think I got it.
    Use category__in with an array of category-IDs and then use tag__and.

  16. [...] but none hit the mark of what I needed. That was until I found this helpful tutorial, entitled Show Related Post in WordPress Without a Plugin by Binny V A. He provides a solution for both tags and categories, which is perfect. (In fact, this [...]

  17. Seyfullah says:

    Hi,
    Firstly thanks for sharing.

    I practise this code there: http://akdeniz.muverrih.net/ inside slider.php

    So i want show related post’s image, bot how?

  18. Mike Smith says:

    I used this code today on a project. thanks for posting it up!

    @Seyfullah – it should be as simple as adding in the custom field code in where it’s pulling the codes from.

  19. Benjamin says:

    I need to use both pieces of code together. Can someone explain how to do this?

    Mores said this in comment #15:

    Use category__in with an array of category-IDs and then use tag__and.

    Thanks in advance!

    • mores says:

      Benjamin, I’m not sure if I can post the code here but here’s what I used to get a list of similar posts for a project I’m working on:

      //for use in the loop, list 5 post titles related to first tag on current post
      $tags = wp_get_post_tags($post->ID);
      if ($tags) {
      $first_tag = $tags[0]->term_id;
      $args=array(
      'tag__and' => array($first_tag),
      'post__not_in' => array($post->ID),
      'showposts'=>5,
      'category__in' => array(26,27,29),
      'caller_get_posts'=>1
      );
      $my_query = new WP_Query($args);
      if( $my_query->have_posts() ) {
      echo "Ähnliche Projekte: ";
      while ($my_query->have_posts()) : $my_query->the_post(); ?>
      <a href="" class="gray" rel="bookmark" title="Permanent Link to ">,
      <?php
      endwhile;
      }
      }

      • Says says:

        @mores, thanks this is the exact code I’ve been searching the past 4 days for. Only problem is it messes up my comments. Comments for the current post are also added to the last “related” post. Do you have a work around for that?

        • mores says:

          Can I look at that somewhere?
          I suspect you’re using this code in the wrong part of the loop.

          Or do I misunderstand and you get the comments for the current AND related post in one?

      • Cen Sin says:

        Still confuse with these line:
        ‘category__in’ => array(26,27,29),

        What am I suppose to fill in for all categories search?

        Thanks

  20. JA says:

    What if I want to exclude one particular tag?
    On my site I use a tag called “feature” to add posts to a rotating feature on the home page, but this tag doesn’t add much to the relatedness of one post to another.
    So, I would like to show posts related by all tags excluding feature

    Ideas?
    JA

  21. mores says:

    JA, use tag__not_in as well. I haven’t tested it, but the WordPress codex features this parameter.
    http://codex.wordpress.org/Function_Reference/get_posts

  22. Kenshiro says:

    Thanks for this piece of code. It’s definitely what I needed for my website. But can I ask you something? If I use the code that shows the other posts in the same category, is there a way to select only the posts that have for example the “review” tag? Thanks for your answer (and sorry for my poor english ^^; ).

  23. David says:

    Kenshiro,

    Idk if this is what you mean, Maybe a lil more info I can help you better,

    from what I got you wanna show a thumb of the post?

    Here is the code i use it shows the related post with ratings img and description,

    <a href="" title=""><img src="ID, $key, true); ?>" class="thumb" alt="" />

    <a href="" title="">post_title) > 25) {

    echo substr(the_title($before = '', $after = '', FALSE), 0, 25) . '...'; } else {

    the_title(); } ?>

    in order for it to work correctly you have to create a thumb folder and include it in your theme check my site for example http://pinkvelvetvids.com/ the main page shows recently added post and random post you can learn all you need to know to create a pages displaying post with tags and more at http://codex.wordpress.org/Template_Tags/query_posts

  24. katie says:

    I was really cursing the one’s who thought of Wp_query() as it can’t getting reset and showing the same query results on one of my theme page. Later i switched to your code for showing related posts and it worked like a charm. Your code is really a life saver. Thanks a lot and keep it up!

  25. Hero says:

    Thanks for the great bit of script. It was exactly what I was looking for and worked like a charm. It’d be cool if you’d show us how to create a version for the functions.php page that we could call into our pages with a hook as well, that’d be super useful.

  26. mores says:

    Hero … just wrap the code into a function
    function relatedposts() {...}
    then call the function in your theme files with

    Probably works only inside the loop, if you need it outside you’ll need to send along the post ID.

  27. Ansar says:

    Great post,
    it is very useful for my site,
    I m using this script for listing all posts, it works perfectly, but I need this list sort by alphabetic order,
    Can anybody help me plz….

    • mores says:

      Ansar, find this line:
      'tag__in' => $tag_ids,
      and add this line beneath it:
      'orderby'=>'title',

      This will sort by the first letter of the title.

  28. This is an awesome bit of code and thank you for sharing. I have used it on numerous occasions but one question I have been meaning to ask is this:

    If there are no related posts, how can I get something like “There are no related posts at this time” to display.

    I have been playing around with it for a while but haven’t gotten it to work. Any ideas or suggestions would be greatly appreciated.

  29. mores says:

    The entire code basically is something like
    if ($tags) { do a lot of stuff}
    Change that to
    if ($tags) { do a lot of stuff} else {echo 'Sorry, no related posts'}

  30. Thanks mores that worked perfectly. And I actually found the correct spot to place it in. I was so close…..lol – I appreciate the help.

  31. mores says:

    No problemo, glad it worked out.

  32. Ognjen Knaus says:

    I’ve just added bellow this line:
    ‘tag__in’ => $tag_ids,

    this line (random option):
    ‘orderby’=>’rand’,

    so it displays different thumbnails each time page is refreshed cause I have a twitter backgrounds gallery and don’t care much about the text :)

    You can see it here how it works:
    http://www.twitterevolutions.com/umbrella-in-the-grass-twitter-background/

    Thanks a lot!

  33. komoloves says:

    Hello, i have been use get_the_ID() for the correct functionaly, with Post-ID no work ok.
    I pass the code to function, i don’t known with this code seem ok.
    Thanks.

  34. Is it possible to prevent WordPress from auto sorting the tags I add in an alphabetical order?
    This sorting causes the code above to give priority to the first tags even though they may be less significant than the later ones.
    I would the first tag of my post to be the first tag I assign to it, and by that tag to generate those related posts….
    thanks!

  35. santosamaru says:

    can you tell me how to make the related post have numeric
    exm

    related post
    1.aaa
    2.
    3.
    4.
    5.
    please let me know the code

    regards
    me

  36. mores says:

    Okay, new attempt to paste in code:
    Replace the and tags with and .

  37. mores says:

    DANG.

    Replace UL with OL in the code :)

  38. donJocuri says:

    Finally managed to make it. Great code man :) I don`t need a plugin anymore.

  39. perke says:

    most of my posts are in 2 categories so when using code above (for categories) i’m getting duplicate posts. is there any way to avoid it?

    thanks

  40. Thanks for the codes. Really useful.

    How to show “No Related Posts” when there is no related posts?

  41. burgstyle says:

    First thanks for this great bit of code.
    I am a complete noob to wordpress /php so I am sure this is a novice question but… How can I add the thumbnail generated by wordpress 3.0 to this function? Any help would be greatly appreciated.

  42. 100driiine says:

    hello,

    You post seems to be very helpful but unfortunately when I cpoy and paste your code on my article for example, and then when I save it – the code is modifying and it doesn’t show the related posts…
    What can I do to stop this?

  43. WPFuss says:

    For some reason when using this code my comments get mixed up between the related posts. How can I fix this?

    Thanks

    • Hey WPFuss – the code in the post is wrong and I’m not sure how it could be left up for so long without someone fixing it..

      You need to add a WP Query Reset at the end of the loop for it to work:

  44. Cindy says:

    THANK YOU!!! I’ve been using another code, but that was interfering with something else I was trying to do. Yours works!!

    I also used

    ‘orderby’ => rand,

    in the $args so it’s not just showing the latest posts.

  45. Jason says:

    If you are using a Custom Post Type like ‘review’ you can still use this code if you add this argument:

    'post_type'=> 'review'

  46. Jeff says:

    Very helpful. Thank you. :)

  47. Ahmed Shaker says:

    That’s a pretty good, much faster in loading than a plugin, even you can customize it as per your needs, thx man ;)

  48. Xcellence-IT says:

    hey great code… I was just wondering whether we can display total views post has received using template tags provided by WordPress Popular Posts Plugin http://wordpress.org/extend/plugins/wordpress-popular-posts/

  49. mores says:

    Code was stripped out. Look here:
    http://wordpress.org/extend/plugins/wordpress-popular-posts/installation/
    all the way at the bottom you’ll find it.

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>