Show Related Post in WordPress Without a Plugin

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

About Binny V A 102 Articles
Freelance Web Developer on the LAMP Platform. Maintains a blogs http://blog.binnyva.com/. Other sites include Bin-Co and OpenJS

45 Comments

  1. After following this tutorial, I couldn’t get a couple of things to work. The permalinks will not work with the register_post_type() and arrays outlined in a function; I simply removed this and permalinks worked fine

  2. Great piece of code – I incorporated the feature thumb in to add a little visual candy. Was wondering if there is a way to randomize the posts that are “related.”

    Thanks,

    Dave

  3. Figured it out – add the line
    ‘orderby’=> rand,
    into the $args=array section and it generates a random set of links each time the page is refreshed – very cool!

    Dave

  4. I found small bug .
    After i used this code on my website, comments was all messed up. When i write comment it take me to another post and comment is written randomly for some other post. If anyone else experience this i try this method
    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 ‘Related Posts’;
    while ($my_query->have_posts()) : $my_query->the_post();
    ?>
    <a href="” rel=”bookmark” title=”Permanent Link to “>
    <?php
    echo '’;
    endwhile;
    }
    wp_reset_query();
    }
    ?>

  5. i’m using using best related post plugin…it more easier no need custom field as thumbnail.
    Just upload,active it..viola..its automatically add thumbnail and also you can match it with your theme setting. You can download it from http://ifile.it/wl26j8x

  6. Thanks for the idea. I also wanted to sort my posts by the number of tags matched. Here’s a solution:


    // ...skipped code

    function related_order($input) {
    return 'COUNT(wp_term_relationships.object_id) DESC, wp_posts.post_date DESC';
    }

    add_filter('posts_orderby', 'related_order');
    $query = new WP_Query($args);
    remove_filter('posts_orderby', 'related_order');

    // ...skipped code

    Of course one may want to add an additional WHERE filter to show posts from the last month only. Or something like that 🙂

  7. Hi, I always used YARPP, but actually when writing about many topics, no related posts will appear – so this code is simple and useful! Just copy-pasted – and it works perfect. Thanks!

  8. Thanks for this. I did struggle with getting it to work with custom post types for a minute. All you have to do is add ‘post_type’ => ‘your_post_type’ to the args and it worked.

  9. Hi,

    Thanks for sharing..I add the code to my single.php and the it worked, however i find that my post with comments does’t show the comment on post page. Can you help me with this please?

    • You need to have a code like

      in there. If not, open an index.php or single.php from a default-theme and look for this line. It’ll output the comments.

  10. For those who are having problems with the comments, after installing the code, here’s the solution:

    Right after the following piece of code:

    <?php
    }
    echo '';
    }
    }
    ?>

    Add a “wp_reset_query ();”. It will be something like:

    <?php
    }
    echo '';
    }
    }
    wp_reset_query ();
    ?>

    This will solve the problem, at least it worked for me!

    • Thanks for the help bro!! It works like a charm..I would like to have a title that say related posts at the top how do i achieve that? Thanks for your help in advance.

  11. Is there a way to assign a current-item class to the li element containing the link of the current post? I know that your code does not shows the current post title in the list but it is very easy to change it to do so.

  12. ‘caller_get_posts’=>1 must be ‘ignore_sticky_posts’=>1. WordPress gives this error otherwise:

    Notice: WP_Query was called with an argument that is deprecated since version 3.1! “caller_get_posts” is deprecated. Use “ignore_sticky_posts” instead.

  13. Great piece of code – I incorporated the feature thumb in to add a little visual candy. Was wondering if there is a way to randomize the posts that are “related.”

    Thank You!

6 Trackbacks / Pingbacks

  1. Don’t Forget wp-reset-query When Using WordPress Hacks
  2. Showing Related Posts by Category in Wordpress | iPhone at Vaskar's Blog
  3. Add Related Posts, with Images, to WordPress without a Plugin \ We Are Pixel8 \ A Creative Studio
  4. 29 WordPress Tweaks to Improve Posts and Pages – October 18, 2011 at 06:02AM « Tao's Tao
  5. 10 Plugin Replacing Tutorials for WordPress | jQuery4u
  6. 20 WordPress Theme Hacks to replace the need for Plugins – WordPress Mastery,collections of free and WordPress themes and plugins

Leave a Reply to Cen Sin Cancel reply

Your email address will not be published.


*