Рассмотрим несколько техник вывода похожих записей (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]

