For example if an article has 3 tags and there is another article that has the exact same 3 tags it should appear at the top of the list. Secondary sorting should be by post date so newer content is favored.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
/** * Select content with common tags. * Sort so content with multiple matching tags are at the top. * Secondary sort on most recent content first. * * @param $post_id * @param int $limit * @return array */ function related_posts($post_id, $limit = 5) { global $wpdb; $query = "SELECT TOP %d x.object_id as ID FROM ( SELECT TOP 10 tr1.object_id, COUNT(tr1.term_taxonomy_id) AS common_tag_count FROM {$wpdb->term_relationships} AS tr1 INNER JOIN {$wpdb->term_relationships} AS tr2 ON tr1.term_taxonomy_id = tr2.term_taxonomy_id WHERE tr2.object_id = %d GROUP BY tr1.object_id HAVING tr1.object_id != %d ORDER BY COUNT(tr1.term_taxonomy_id) DESC ) x INNER JOIN {$wpdb->posts} p ON p.ID = x.object_id ORDER BY common_tag_count DESC, p.post_date DESC;"; $query = $wpdb->prepare($query, $limit, $post_id, $post_id); $ids = $wpdb->get_col($query); $posts = []; foreach($ids as $id) { $posts[] = get_post($id); } return $posts; } |
If you like this question & answer and want to contribute, then write your question & answer and email to freewebmentor[@]gmail.com. Your question and answer will appear on FreeWebMentor.com and help other developers.