Я в очередной раз приступил к изобретению велосипеда. Скорее всего уже есть плагин, который делает то, что я задумал, но мне интересно самому в этом покопаться. Если вы посмотрите в конец поста в этом блоге, то увидите список похожих записей.
Раньше в нем были четыре последних поста, совпадающие по первому тегу с текущим постом. В принципе, выборка нескольких постов с такими же тегами, что и у текущего, дает хорошую перелинковку между страницами схожей тематики. Хорошую, но не всегда точную.
Например, между постами, размещенными в категории Акции и в категории Плагины есть большая разница. В категорию Акции попадают посты, относящиеся к работе этого блога: проводимые в нем конкурсы, нововведения, объявления, и прочее. В категории же Плагины публикуются обзоры плагинов. Даже если посты из этих категорий и будут иметь одинаковые теги, все же их нельзя с уверенностью назвать похожими. По-настоящему похожими будут посты с одинаковыми тегами из той же самой категории.
Поэтому я поставил задачу сделать код, который бы выводил список похожих по тегам постов из той же категории, что и текущий пост, либо из тех категорий, которые я укажу (например, для поста из категории Настройки будет актуален список похожих постов из категории Настройки и категории Плагины). Если вам нужен вывод похожих по тегам постов из одной категории (или нескольких указанных), то можете использовать нижеприведенный код.
За основу я взял код из поста Как вывести список похожих постов без плагинов (по тегам) и изменил его, добавив предварительное ограничение по категориям.
В файл functions.php нужно добавить:
function mam_posts_join ($join) {
global $mam_global_join;
if ($mam_global_join) $join .= " $mam_global_join";
return $join;
}
add_filter('posts_join','mam_posts_join');
В файл single.php, в то место, где нужно вывести список похожих постов, нужно вставить:
<div>
<!-- если это категория Вопросы, то выводятся похожие посты только из категории Вопросы-->
// 28 - это ID категории Вопросы
<!-- если это категория Ссылки, то выводятся похожие посты только из категории Ссылки-->
<!-- если это категория Акции, то выводятся похожие посты только из категорий Акции, Плагины, Настройки, Темы-->
<!-- если это категория Настройки, то выводятся похожие посты только из категории Настройки-->
<!-- если это категория Плагмны, то выводятся похожие посты только из категории Плагины-->
<!-- если это категория Темы, то выводятся похожие посты только из категории Темы-->
<!-- если это категория Программы, то выводятся похожие посты только из категории Программы-->
term_relationships tr
ON (tr.object_id = $wpdb->posts.ID)
JOIN $wpdb->term_taxonomy tt
ON (tt.term_taxonomy_id = tr.term_taxonomy_id
AND tt.taxonomy = 'category'
AND tt.term_id in ($categories))";
$tagargs = array('categories' => $categories);
$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'=> 4, //количество выводимых постов
'caller_get_posts'=> 1, //начиная с первого поста
'orderby'=> rand //при обновлении страницы выведутся другие посты, выбранные случайным образом
);
$rp_query = new wp_query($args);
endif;
if($rp_query):
if($rp_query->have_posts())
?>
have_posts()): $rp_query->the_post(); ?>
<!-- тут начинается код, отвечающий за вид ссылки-->
<a title="" href=""></a>
<!-- /тут заканчивается код, отвечающий за вид ссылки-->
</div>
Таким образом, ориентируясь не только на теги, но и учитывая категории, обеспечивается более точная выборка похожих постов. Конечно же, в коде вы должны использовать свои значения ID и ярлыки категорий.
[info txt=”Так как я не программист, то за точность и оптимальность приведенного кода не ручаюсь (у меня в блоге он прекрасно работает).Буду благодарен тем, кто подскажет, как автоматизировать формирование массива категорий для переменной $categories.”]








