Вывод похожих записей в Word Press без плагинов

13 января 2012


Вывод похожих записей в блоге (related posts) является своего рода обязательным дополнением общего функционала.
Эта функция не только увеличивает глубину просмотра блога, но и улучшает индексацию, являясь одним из способов внутренней перелинковки.
Признаком похожести записей являются назначенные им теги (метки записи). Применять теги гораздо удобнее, чем относить записи к нескольким рубрикам блога.
Рубрики, как правило, формируют основное или дополнительное меню, а теги расширяют поиск по блогу и улучшают навигацию, поскольку могут состоять из целых фраз и даже предложений.
Для примера рассмотрим такой вариант: на сайте есть рубрика «Создание сайтов». Эта рубрика отображается в главном меню и содержит перечень статей, касающихся процесса создания сайтов.
Среди записей этой рубрики есть статьи про верстку, про дизайн сайтов, про настройку виртуального сервера. Каждой из них мы можем назначить тег (а лучше несколько), характеризующий данную запись.
Например, статья про настройку сервера Denwer может иметь теги: denwer, сервер.
Также, предположим, есть рубрика «Продвижение сайтов», где также содержится ряд статей, одна из которых про влияние технических характеристик сервера на индексацию сайта. Этой статье мы также присвоили метки, среди которых
тег «сервер». Тем самым эти две статьи, находящиеся в разных рубриках получили похожесть. Пользователя, который прочел про настройку Denwer, возможно также заинтересует статья из рубрики «Продвижение сайтов», во всяком
случае мы надеемся на это, соответственно необходимо как-то ему сообщить об этом, то есть отобразить заголовок похожей (похожих) статьи.

Рассмотрим как это реализовать без помощи сторонних плагинов в WordPress.
Скачиваем с сервера файл single.php. Файл single.php находится в папке текущей темы и отвечает за вывод одиночной записи блога, то есть поста.
Открываем файл и ищем место, где заканчивается вывод основной записи и дописываем в то место, где хотим увидеть блок похожих записей фрагмент кода:

< ?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,
'post__not_in' => array($post->ID),
'showposts'=>5, // Количество похожих постов для показа.
'caller_get_posts'=>1
);
$my_query = new wp_query($args);
if( $my_query->have_posts() ) {
echo '<h3>Похожие записи</h3><ul>';
while ($my_query->have_posts()) {
$my_query->the_post();
?>
<li><a href="<?php the_permalink() ?>" rel="bookmark"
title="Permanent Link to < ?php the_title_attribute(); ?>">
< ?php the_title(); ?></a></li>
< ?php
}
echo '</ul>';
}
}
?>

Сохраняем файл single.php обязательно в кодировке UTF-8 (поскольку фрагмент кода содержит русские символы) без BOM и заливаем обратно на сервер. Обновляем страницу одиночной записи.

Данный фрагмент кода проверялся в WordPress версии 2.8.

Вот ещё несколько примеров вывода похожих записей без плагина:

<pre><h3>Похожие статьи:</h3>
<div>
<ul>
< ?php
//for use in the loop, list 5 post titles related to first tag on current post
$tags = wp_get_post_tags($post->ID);
if ($tags) {
$first_tag = $tags[0]->term_id;
$args=array(
'tag__in' => array($first_tag),
'post__not_in' => array($post->ID),
'showposts'=>5,
'caller_get_posts'=>1
);
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post(); ?>
<li><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to < ?php the_title_attribute(); ?>">< ?php the_title(); ?></a></li>
< ?php
endwhile;
}
wp_reset_query();
}
?>
</ul>
</div></pre>

Этот фрагмент тестировался на версии 3.1. и прекрасно работал. Также в файле style.css можно прописать для класса

.sample-posts ul li

набор стилей, чтобы вписать блок похожих записей в общий дизайн сайта. Этот фрагмент кода выводит похожие записи на основе тегов, также в качестве примера приведу код, выводящий подобные записи на основе принадлежности к одной категории (рубрике):

<pre><div>
<h3>Похожие статьи:</h3>
< ?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'=>5, // Number of related posts that will be shown.
'caller_get_posts'=>1
);
// Rest is the same as the previous code
$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();
}
?></ul></div></pre>
Протестированные фрагменты кода частично были взяты с: http://fleek.org. Статья написана не с целью перепечатки, а в качестве личной заметки после тестов на реально существующем блоге.


Один комментарий

  1. Дмитрий

    20 ноября 2012
    /

    Комментарий к статье писать пробовали после добавления такого кода? Он добавляется к последней статье списка, а не к текущей записи! Запоминать надо указатель на текущую статью, а потом, перед добавлением комментариев, восстанавливать.


Обязательные поля отмечены *

Добавить комментарий