Post explains simple way of how to display related posts based on best matching post tags and categories. It is only needed to expand theme file single.php with SQL and final loop. In two steps you can have related posts feature without plugin installation.
First step: SQL wrapped in PHP function
function get_related_posts($id, $limit=5){
global $wpdb; // enable access to the WordPress DB object
global $related_cache; // define cache variable
// if related_cache has value, then return previous fetched data
if ($related_cache) return $related_cache;
// define SQL
$sql = "select concat('/', p.category, '/', p.post_name, '/') as permalink, p.post_title as title, count(*) as cnt
from wp_term_relationships tr, wp_term_taxonomy tt, wp_terms,
( /* prepare posts and categories with smallest term_id per post */
select p.ID, p.post_name, p.post_title, p.post_date, wp_terms.slug as category
from wp_posts p, wp_term_relationships tr, wp_term_taxonomy tt, wp_terms
where
p.ID != $id and /* exclude observed post */
p.post_type = 'post' and
p.post_status = 'publish' and
p.ID = tr.object_id and
tr.term_taxonomy_id = tt.term_taxonomy_id and
tt.taxonomy = 'category' and
tt.term_id = wp_terms.term_id
group by p.ID, p.post_title, p.post_name, p.post_date
order by wp_terms.term_id
) p,
( /* fetch 'post tags' and 'category' for counting */
select distinct wp_terms.slug
from wp_term_relationships tr, wp_term_taxonomy tt, wp_terms
where
tr.object_id = $id and
tr.term_taxonomy_id = tt.term_taxonomy_id and
tt.taxonomy in ('post_tag', 'category') and
tt.term_id = wp_terms.term_id
) tg
where
p.ID = tr.object_id and
tr.term_taxonomy_id = tt.term_taxonomy_id and
tt.taxonomy in ('post_tag', 'category') and
tt.term_id = wp_terms.term_id and
wp_terms.slug = tg.slug
group by p.post_title, p.post_name, p.category
/* order related posts with max 'post tags' count first */
order by cnt desc, p.post_date desc
limit $limit";
// execute SQL and save result set to the related_cache variable
$related_cache = $wpdb->get_results($sql);
// return result set as object
return $related_cache;
}
SQL query is optimised for permalinks with format /%category%/%postname%/. In case of different format, you will have to customize SQL and PHP code.
Second step: Show 5 related posts
<h3>Related posts</h3>
<ul>
<?php
// fetch 5 related posts
$related_posts = get_related_posts($post->ID, 5);
// open loop
foreach ($related_posts as $related_post) {
$permalink = $related_post->permalink;
$title = $related_post->title;
print "<li><a title=\"$title\" href=\"$permalink\">$title</a></li>\n";
} ?>
</ul>
Related posts can be displayed at the post bottom. First parameter is ID of the shown post while second parameter is number of related posts to show. Main SQL might seems long but it has two subqueries to prepare post permalink and to count tags of other posts. Anyway, as you can see, described method works great on my blog. Cheers!
thanks buddy
wow, nice, nice.
With some knowledge of SQL, it’s possible to retrieve almost any data out of WordPress. Data model is simple and it’s easy to join tables in SQL query. Hope this code will give you an example how to easily display related posts. Thanks!
Hi
can you please tell me How to get the post thumbnail in this code?