Рассмотрим несколько техник вывода похожих записей (Related posts). Похожие записи можно выводить двумя способами: автоматически (алгоритм) и в ручную. Методы вывода похожих записей: кусок кода в шаблоне single, либо плагином.
Автоматический способ вывода похожих записей. Используем чистый код вывода php
Похожие записи по меткам
Вставляем код в шаблон вывода записи (single.php), ниже основного цикла
Жирным выделена поддержка произвольных типов записей (‘post_type’=> ‘any’)
<div id="related-posts"> <h3>Похожие записи:</h3> <?php $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, // Сортировка происходит по тегам (меткам) 'orderby'=>'rand', // Добавляем условие сортировки рандом (случайный подбор) 'ignore_sticky_posts'=>1, // Запрещаем повторение ссылок 'post__not_in' => array($post->ID), 'showposts'=>5, // Цифра означает количество выводимых записей 'post_type'=> 'any' ); $my_query = new wp_query($args); if( $my_query->have_posts() ) { echo '<ul>'; while ($my_query->have_posts()) { $my_query->the_post(); ?> <li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php } echo '</ul>'; } wp_reset_query(); } ?></div>
Альтернативный вариант кода (упрощенный, правильный)
<!-- Related posts block --> <?php $tags = wp_get_post_tags($post->ID); if ($tags) : //Проверяем есть ли тэги ?> <?php $tag_ids = array(); foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id; $args=array( 'tag__in' => $tag_ids, // Сортировка происходит по тегам (меткам) 'orderby'=>rand, // Добавляем условие сортировки рандом (случайный подбор) 'ignore_sticky_posts'=>1, // Запрещаем повторение ссылок 'post__not_in' => array($post->ID), 'showposts'=>5 // Цифра означает количество выводимых записей ); $my_query = new wp_query($args); if( $my_query->have_posts() ) : ?> <hr class="line"> <div id="related-posts"> <div id="post-content"> <p>Похожие записи:</p> <?php while ($my_query->have_posts()) : $my_query->the_post(); ?> <div <?php post_class() ?> id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink(); ?>"> <?php if( has_post_thumbnail() ) {the_post_thumbnail(square);} else {echo '<img src="'.get_bloginfo("template_url").'/images/img-default-square.jpg" />';} ?> </a> <h2 class="title-post"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php if( get_the_tag_list()): ?><?php the_tags( '<small>', ' / ', '</small>' ); ?><?php endif; ?> </div> <?php endwhile; ?> </div> </div> <?php endif; ?> <?php endif; ?> <?php wp_reset_query(); ?>
Похожие записи по категориям (используется реже)
Также вставляем код в шаблон single.php, ниже основного цикла
<div id="related-posts"> <h3>Дополнительные записи</h3> <ul> <?php $categories = get_the_category($post->ID); if ($categories) { $category_ids = array(); foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id; $args=array( 'category__in' => $category_ids, 'post__not_in' => array($post->ID), 'showposts'=>3, // Количество выводимых записей 'ignore_sticky_posts'=>1 ); $my_query = new wp_query($args); if( $my_query->have_posts() ) { echo ''; while ($my_query->have_posts()) { $my_query->the_post(); ?> <li class="post_mini"> <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2> <?php if ( (function_exists('has_post_thumbnail')) && (has_post_thumbnail()) ) : ?> <a class="post_thumbnail" href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" alt=""><?php the_post_thumbnail(array( 234,124)); ?></a> <?php endif; ?> </li> <?php } echo ''; } wp_reset_query(); } ?> </ul> </div>
Альтернативный вариант (правильный)
<!-- Related posts block --> <?php $categories = get_the_category($post->ID); if ($categories) : //Проверяем есть ли тэги ?> <?php $category_ids = array(); foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id; $args=array( 'category__in' => $category_ids, 'post__not_in' => array($post->ID), 'showposts'=>3, // Количество выводимых записей 'ignore_sticky_posts'=>1 ); $my_query = new wp_query($args); if( $my_query->have_posts() ) : ?> <hr class="line"> <div id="related-posts"> <div id="post-content"> <p align="center"><strong>Похожие товары:</strong></p> <?php while ($my_query->have_posts()) : $my_query->the_post(); ?> <div <?php post_class() ?> id="post-<?php the_ID(); ?>"> <div class="photo"> <a href="<?php the_permalink(); ?>"> <?php if( has_post_thumbnail() ) {the_post_thumbnail(square);} else {echo '<img src="'.get_bloginfo("template_url").'/image/no-mage.jpg" />';} ?> </a> </div> <h2 class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php the_tags( '<p class="tm">ТМ: ', ' / ', '</p>' ); ?> </div> <?php endwhile; ?> </div> </div> <?php endif; ?> <?php endif; ?> <?php wp_reset_query(); ?>
Похожие записи по категории и по тегу
В упрощенный код по категориям добавляем (после строки foreach)
$tags = get_the_tags($post->ID); foreach($tags as $individual_tag);
А в формирование массива вносим 2 записи (выделено жирным)
$args=array( 'category__in' => $category_ids, 'tag__in' => $individual_tag->term_id, 'orderby' => 'rand', //для разнообразия 'post__not_in' => array($post->ID), 'showposts'=>3, // Количество выводимых записей 'ignore_sticky_posts'=>1 );
Ручное назначение похожих записей
Плагин Related
После активации плагина в админке редактирования записей появляется дополнительный модуль, в котором мы в ручную выбираем похожие на текущую записи.
Обновленный вариант по меткам
19.02.2018: Добавил проверку есть ли метки и удалил неиспользуемые методы
<!-- Related posts block --> <?php $tags = wp_get_post_tags($post->ID, array( 'fields' => 'ids' )); ?> <?php if (!empty($tags)): //Проверка есть ли теги ?> <?php $tag_ids = array(); foreach($tags as $individual_tag) $tag_ids[] = $individual_tag; $args = array( 'tag__in' => $tag_ids, 'orderby' => 'rand', 'post__not_in' => array($post->ID), 'showposts' => 3, 'post_type' => 'post' ); $my_query = new wp_query($args); if( $my_query->have_posts() ) : ?> <h2>Вас также могут заинтересовать:</h2> <div id="posts-archive"> <?php while ($my_query->have_posts()) : $my_query->the_post(); ?> <?php get_template_part( 'solus' ); ?> <?php endwhile; ?> </div> <?php endif; ?> <?php wp_reset_query(); ?> <?php endif; ?>[site-socialshare]