Вывод похожих постов на основе меток

Зачем нужны: схожие посты:

  1. С точки зрения SEO – это дополнительная перелинковка между постами блога
  2. Дополнительная навигация для посетителей
  3. Способ удержания читателя на блоге
  4. Если пользуетесь биржами ссылок, то повышает стоимость размещенных на них ссылок, уменьшая уровень вложенности

Схожесть постов принято определять на основе:

  • меток
  • ключевых слов
  • заголовков
  • тайтлов (тэг title)
  • комбинации выше перечисленных параметров

Существует немало плагинов, таких как WordPress Related Posts, Simple Tags и т.п., генерирующих список связанных постов. Я отказался от плагинов и решил написать несложный sql-запрос, отображающий в самом низу каждого поста связанные с ним через метки посты случайным образом.

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
<?php 
$query="
SELECT $wpdb->posts.post_title, $wpdb->posts.guid, $wpdb->posts.ID , $wpdb->posts.comment_count
FROM  $wpdb->posts 
LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
LEFT JOIN  $wpdb->term_taxonomy ON ($wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id) 
LEFT JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id)
WHERE $wpdb->posts.ID <> $post->ID AND $wpdb->posts.post_status = 'publish' AND $wpdb->terms.term_id IN 
	(
	SELECT $wpdb->terms.term_id FROM  $wpdb->term_relationships
	LEFT JOIN  $wpdb->term_taxonomy ON ($wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id) 
	LEFT JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id)
	WHERE $wpdb->term_relationships.object_id = $post->ID AND $wpdb->term_taxonomy.taxonomy='post_tag'
	)
 GROUP BY $wpdb->posts.ID ORDER BY RAND() LIMIT 3";
$related_posts = $wpdb->get_results($query); 
if ($related_posts) 
{
echo("<p>Схожие посты:</p>");
echo("<ul>");
foreach ($related_posts as $post) 
	{ 
	echo("<li><a href=\"".get_permalink($related_post->ID)."\" title=\"".$related_post->post_title."\">".$related_post->post_title."</a> (".$related_post->comment_count.")</li>");
	}
echo("</ul>"); 
}
?>

Небольшие разъяснения: php-код размещается в файле, который отвечает за вывод постов (у меня theloop.php, может называться single.php, различается в зависимости от шаблона блога). В запросе выбираются 3 поста, но можете указать любую другую цифру (см. строчку ORDER BY RAND() LIMIT 3).

А какой способ определения схожести постов Вы считаете наиболее логичным?

Комментарии:

  1. Дмитрий

    Здравствуйте. Подскажите как подсчитать количество постов с условием фильтра “категория и метка”. Нужно именно с помощью $wpdb