Я в очередной раз приступил к изобретению велосипеда. Скорее всего уже есть плагин, который делает то, что я задумал, но мне интересно самому в этом покопаться. Если вы посмотрите в конец поста в этом блоге, то увидите список похожих записей.
Раньше в нем были четыре последних поста, совпадающие по первому тегу с текущим постом. В принципе, выборка нескольких постов с такими же тегами, что и у текущего, дает хорошую перелинковку между страницами схожей тематики. Хорошую, но не всегда точную.
Например, между постами, размещенными в категории Акции и в категории Плагины есть большая разница. В категорию Акции попадают посты, относящиеся к работе этого блога: проводимые в нем конкурсы, нововведения, объявления, и прочее. В категории же Плагины публикуются обзоры плагинов. Даже если посты из этих категорий и будут иметь одинаковые теги, все же их нельзя с уверенностью назвать похожими. По-настоящему похожими будут посты с одинаковыми тегами из той же самой категории.
Поэтому я поставил задачу сделать код, который бы выводил список похожих по тегам постов из той же категории, что и текущий пост, либо из тех категорий, которые я укажу (например, для поста из категории Настройки будет актуален список похожих постов из категории Настройки и категории Плагины). Если вам нужен вывод похожих по тегам постов из одной категории (или нескольких указанных), то можете использовать нижеприведенный код.
За основу я взял код из поста Как вывести список похожих постов без плагинов (по тегам) и изменил его, добавив предварительное ограничение по категориям.
В файл 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.”]