Кратко: связанные записи (related posts) — это блок похожих статей под текстом записи, который помогает читателю не уходить с сайта и глубже знакомиться с материалами. В WordPress его собирают тремя способами: готовым плагином (настраивается за 5 минут, но добавляет запросы к базе и вес сайту), своим кодом через WP_Query или get_posts (полный контроль над логикой и разметкой) и комбинированно — плагин плюс кастомный шаблон вывода. Для блога на 20–30 материалов хватает плагина, для нагруженного проекта и интернет-магазина лучше свой цикл с кэшем через transient: он не тормозит страницу и не мешает основному запросу. Ключевые правила: подбор по общей рубрике или метке, не более 3–6 карточек за раз, обязательный wp_reset_postdata и кэширование результата.
Что такое связанные записи и зачем они нужны
Связанные записи — это автоматически подобранный блок из нескольких материалов сайта, тематически близких к той статье, которую читает посетитель. Выглядеть он может по-разному: сетка карточек с миниатюрами, список ссылок под текстом, слайдер или блок в сайдбаре. Суть одна: человек, дочитавший статью, получает следующий логичный шаг вместо кнопки «назад» в браузере.
Польза от такого блока трёхсторонняя. Читателю он экономит время на поиск продолжения, владельцу сайта повышает глубину просмотра и число страниц за сессию, а поисковым системам показывает структуру сайта: какие материалы связаны между собой и насколько логично устроен раздел. Для блога с десятками технических статей это едва ли не самый дешёвый способ удержать посетителя.
Есть и вторая, менее очевидная задача. Внутренние ссылки передают вес между страницами и помогают продвигать материалы, до которых иначе не доходят ссылки из меню. Как это работает в связке с другими SEO-настройками, разобрано в статье про настройку Rank Math и Yoast по шагам, а здесь сосредоточимся на технической части: как именно вывести похожие статьи в WordPress.
Три способа вывести похожие статьи: сравнение подходов
Прежде чем писать код, стоит выбрать принцип работы. Способов ровно три, и у каждого своя ниша: готовый плагин, собственный код и гибридный вариант. Разница проявляется не в момент запуска, а через полгода: когда понадобится поменять разметку, ускорить страницу или объяснить логику подбора заказчику.
| Подход | Как работает | Что нужно уметь | Когда выбирать |
|---|---|---|---|
| Готовый плагин | Находит похожие записи по рубрикам, меткам и ключевым словам, выводит блок через свою разметку | Настроить опции в админке | Маленький блог, нет разработчика, нужен результат сегодня |
| Свой код в теме | Свой WP_Query по рубрикам или меткам, свой HTML-шаблон и стили | PHP, базовые знания темы | Важны скорость, вид и полный контроль над подбором |
| Гибрид | Плагин отвечает за подбор, шаблон вывода переопределяется в теме | Основы хуков и шаблонов | Уже стоит плагин, но нужен свой вид без переписывания логики |
Общее правило для всех вариантов одно: не выводите десяток карточек. Оптимально 3–6 ссылок — этого достаточно, чтобы предложить следующий материал, и мало, чтобы превратить блок в свалку. Больше не значит лучше: пользователь почти никогда не пролистывает дальше шести пунктов, а страница при этом становится тяжелее.
Готовые плагины для связанных записей
Самый быстрый путь — поставить плагин. В каталоге WordPress есть несколько решений с разной логикой подбора, и выбирать стоит по тому, на что вы опираетесь при группировке материалов: рубрики, метки, таксономии или ключевые слова.
| Решение | Логика подбора | Стоимость | Особенности |
|---|---|---|---|
| YARPP | По рубрикам, меткам и сходству текста | Есть бесплатная версия, PRO — платно | Гибкие настройки, умеет миниатюры и шаблоны вывода |
| Related Posts by Taxonomy | По общим терминам любой таксономии | Бесплатно | Простой, работает с кастомными таксономиями |
| Contextual Related Posts | По содержимому текста и заголовкам | Есть бесплатная версия, PRO — платно | Умеет кэш и вывод в записях, на главной и в фиде |
| Свой код вместо плагина | Любая логика, которую вы напишете | Разработка под проект | Максимальная скорость, нулевой лишний функционал |
Настраивать плагины принято на странице их параметров: там выбирают тип содержимого, число записей, источник подбора и способ вывода — автоматически под контент, через шорткод или в виджете. Если нужен блок в сайдбаре или в произвольном месте шаблона, сначала стоит разобраться, как вообще устроена эта область, — об этом подробно в статье виджеты и сайдбары WordPress. Шорткод плагином обычно тоже поддерживается: тогда блок можно вставить прямо в текст или в блок редактора, а как устроены такие вставки — рассказано в материале шорткоды WordPress: как создавать свои.
Свой вывод: get_posts и WP_Query по категории
Когда нужен полный контроль, блок собирают кодом прямо в теме. Самый компактный вариант — get_posts(): он возвращает массив записей и не трогает глобальный объект $post, поэтому основной цикл страницы не ломается. Код можно добавить в functions.php дочерней темы или в отдельный файл шаблона.
<?php
// 1. Похожие записи по рубрикам текущей статьи
$cats = wp_get_post_categories( get_the_ID() );
$related = get_posts( array(
'post_type' => 'post',
'posts_per_page' => 4,
'post__not_in' => array( get_the_ID() ),
'category__in' => $cats,
'orderby' => 'rand',
'ignore_sticky_posts' => true,
'no_found_rows' => true,
) );
if ( $related ) {
echo '<div class="related-posts"><h3>Похожие статьи</h3><ul>';
foreach ( $related as $item ) {
printf(
'<li><a href="%s">%s</a></li>',
esc_url( get_permalink( $item ) ),
esc_html( get_the_title( $item ) )
);
}
echo '</ul></div>';
}
Разберём ключевые параметры. post__not_in исключает из выдачи саму статью — без него она охотно встанет первой в список. category__in ограничивает подбор общими рубриками. no_found_rows отключает подсчёт общего числа найденных записей: он нужен только для пагинации, и его отсутствие заметно ускоряет запрос. orderby => 'rand' перемешивает результат, чтобы одни и те же материалы не показывались постоянно, но за случайную сортировку приходится платить производительностью на больших базах.
Если нужен не просто список, а сложная логика — исключения, свои поля, сортировка по популярности, — берут WP_Query. Он даёт больше параметров, но требует аккуратности: после своего цикла обязательно вызывайте сброс. Разбор продвинутых запросов с примерами — в статье WP_Query в WordPress: продвинутая работа с запросами.
Как подбирать похожие материалы: рубрики, метки, таксономии
Качество блока определяется не вёрсткой, а логикой подбора. Самый предсказуемый критерий — общая рубрика: у каждой статьи она есть почти всегда, и материалы внутри рубрики действительно близки по теме. Метки дают более точное совпадение, но работают только при дисциплине: если метки ставятся от случая к случаю, подбор превратится в случайный.
<?php
// 2. Подбор по меткам с откатом на рубрики
$post_id = get_the_ID();
$tags = wp_get_post_tags( $post_id, array( 'fields' => 'ids' ) );
$args = array(
'post_type' => 'post',
'posts_per_page' => 4,
'post__not_in' => array( $post_id ),
'ignore_sticky_posts' => true,
'no_found_rows' => true,
);
if ( $tags ) {
$args['tag__in'] = $tags;
} else {
$args['category__in'] = wp_get_post_categories( $post_id );
}
$q = new WP_Query( $args );
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
echo '<a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a>';
}
wp_reset_postdata();
}
Такой приём «метки, а при их отсутствии рубрики» почти всегда даёт непустой блок: если у материала нет меток, он не останется без рекомендаций. Для кастомных типов записей и своих таксономий логика та же, только вместо рубрик используется нужная таксономия — база описана в статье про кастомные типы записей и таксономии, а вывод терминов разобран в материале шаблон таксономии в WordPress.
Подбирать поля и проверять, что запрос собирается так, как вы задумали, удобнее с включённой отладкой — как её настроить, рассказано в материале WP_DEBUG и отладка WordPress. Третий критерий — популярность или свежесть. Свежие материалы логично предлагать в новостных разделах, популярные — в справочных, где важно отдать читателю проверенное. Если вы храните просмотры в метаполе, сортировка задаётся через meta_key и orderby => 'meta_value_num'. И не смешивайте всё сразу: три критерия в одном запросе дают непредсказуемую выдачу, которую невозможно объяснить заказчику.
Кэширование и производительность блока
Блок связанных записей легко становится узким местом: он выполняется на каждой странице записи, а запрос с сортировкой по случайному полю да ещё и по нескольким таксономиям — не самый дешёвый. На сайте с сотнями материалов это заметно по времени ответа сервера, особенно без объектного кэша.
<?php
// 3. Кэшируем список похожих записей на 12 часов
function my_related_ids( $post_id ) {
$key = 'my_related_' . (int) $post_id;
$cached = get_transient( $key );
if ( false !== $cached ) {
return $cached;
}
$q = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 4,
'post__not_in' => array( $post_id ),
'category__in' => wp_get_post_categories( $post_id ),
'fields' => 'ids',
'ignore_sticky_posts' => true,
'no_found_rows' => true,
) );
$ids = $q->posts;
set_transient( $key, $ids, 12 * HOUR_IN_SECONDS );
return $ids;
}
Три приёма дают основной выигрыш. Первый — fields => 'ids': база возвращает только идентификаторы, а не полные объекты записей, и это в разы легче. Второй — transient на 12 часов: список не пересчитывается при каждом заходе, а обновляется по расписанию. Третий — отказ от случайной сортировки в пользу предсказуемой, например по дате. Как кэш в целом влияет на скорость WordPress, подробно разобрано в статье кэширование WordPress для новичков, а общие приёмы ускорения — в материале как ускорить WordPress: минификация и объединение CSS и JS.
Ещё один нюанс: если сайт работает на объектном кэше (Redis, Memcached), transient уходит в память, а не в базу, и блок перестаёт быть заметен в профилировании. На маленьком блоге разница незаметна, на крупном проекте без кэша один лишний неоптимизированный запрос на каждой странице — это уже сотни тысяч лишних запросов в сутки.
Вывод блока: разметка, миниатюры и мобильная версия
Когда список записей получен, его нужно оформить. Базовый набор полей на карточку: миниатюра, заголовок и, при желании, дата или рубрика. Миниатюру берут через get_the_post_thumbnail() с заранее зарегистрированным размером, чтобы не грузить полноразмерные изображения в блок шириной 300 пикселей.
<?php
// 4. Карточка похожей записи
echo '<div class="related-grid">';
foreach ( my_related_ids( get_the_ID() ) as $rid ) {
printf(
'<a class="related-card" href="%1$s">%2$s<span>%3$s</span></a>',
esc_url( get_permalink( $rid ) ),
get_the_post_thumbnail( $rid, 'medium', array( 'loading' => 'lazy' ) ),
esc_html( get_the_title( $rid ) )
);
}
echo '</div>';
Если хотите вынести весь блок из шаблона в отдельную функцию, прицепите его к хуку — как это работает, описано в статье хуки WordPress: actions и filters для новичка.
Разметка должна быть предсказуемой: у карточки своя ссылка, заголовок внутри ссылки, изображение с заполненным атрибутом alt (у миниатюры он берётся из настроек медиафайла). Заголовок в карточке лучше ограничить двумя строками через CSS и не полагаться на обрезку функцией wp_trim_words() — она нормально справляется с текстом, но непредсказуема на длинных словах вроде названий функций.
Сетку делают на CSS Grid или флексах, и здесь важна мобильная проверка: четыре карточки в ряд на широком экране должны превращаться в одну колонку на телефоне. Если часть интерфейса должна обновляться без перезагрузки страницы — например, кнопка «показать ещё», — её собирают через AJAX в WordPress на admin-ajax. Отдельно проверьте, не попадает ли блок под действие ленивой загрузки и не сдвигается ли вёрстка при подгрузке миниатюр: без указанной высоты картинки блок «прыгает». Общие приёмы проверки: мобильная версия сайта: зачем нужна и как проверить.
Связанные записи и SEO: что важно учитывать
С точки зрения продвижения блок решает две задачи: распределяет внутренний вес и удерживает посетителя. Поисковые системы видят, что страницы связаны по смыслу, а читатель получает переход дальше вместо возврата в выдачу. Особенно полезно это для длинных технических материалов, которые почти никто не читает целиком с первого захода.
Что стоит держать в голове. Анкоры должны быть осмысленными: «Похожие статьи» в заголовке блока — нормально, а вот «читать тут» и «подробнее» в ссылках не несут смысла. Число ссылок — умеренное: если на каждой из сотни статей висит по десять внутренних ссылок на пять соседей, вы получаете плотную перелинковку без всякой пользы. И не подставляйте в блок популярные страницы «для трафика»: посетитель, который искал статью про WP_Query, не обрадуется ссылке на заказ сайтов.
Есть и техническая сторона: блок не должен дублироваться на страницах архивов и в фидах, иначе поисковик увидит тысячи одинаковых ссылочных блоков. Похожая логика у закрытия лишнего от индексации — а способы закрыть лишнее от индексации перечислены в материале robots.txt и noindex в WordPress, а карта сайта, которая помогает поисковику быстрее обойти новые материалы, настраивается по инструкции XML-карта сайта для Яндекса и Google.
Когда блок нужен, а когда лучше без него
Связанные записи — не обязательный элемент для любого сайта. Они хорошо работают там, где есть поток однотипного контента: блог с десятками статей, справочный раздел, база знаний, новостная лента, каталог с сотнями товаров, у которых настроены общие таксономии. В этих случаях блок реально увеличивает глубину просмотра.
Плохо он работает на маленьких сайтах: если в блоге восемь статей, любая рекомендация либо повторит уже прочитанное, либо будет случайной. Не стоит ставить блок и туда, где он мешает конверсии: на страницах услуг и в коммерческих лендингах лучше вести посетителя к заявке, а не отвлекать его чтением соседних материалов. И последнее: не подменяйте блоком навигацию — связные разделы сайта должны быть в меню, а не только в автоматических рекомендациях.
Если материалов у вас много, а структура рубрик размыта, сначала наведите порядок в таксономиях — от них напрямую зависит качество подбора, — и только потом включайте блок. Помочь с этим может отдельная задача для разработчика: что можно поручить программисту, описано в материале заказать доработку сайта.

Частые вопросы про связанные записи в WordPress
Как вывести связанные записи в WordPress без плагина?
Добавьте в functions.php дочерней темы функцию с get_posts или WP_Query по рубрикам текущей записи, исключив её саму через post__not_in, и выведите результат в single.php после основного цикла. Для ускорения ставьте fields => ‘ids’, no_found_rows => true и кэшируйте список через transient. После своего цикла вызывайте wp_reset_postdata().
Какой плагин связанных записей лучше выбрать?
Для простого блога удобен Related Posts by Taxonomy: он бесплатный и подбирает материалы по общим терминам таксономий. YARPP и Contextual Related Posts дают больше настроек, умеют миниатюры, шаблоны вывода и кэш, но часть возможностей доступна только в платных версиях. Если важен вид и скорость, берите плагин за основу подбора, а шаблон вывода переопределите в теме.
Не замедлит ли блок похожих статей сайт?
Может, если оставить случайную сортировку, выборку полных объектов записей и обход всех таксономий без кэша. Три приёма убирают проблему: fields => ‘ids’ вместо полных объектов, transient на 12 часов вместо пересчёта при каждом заходе и предсказуемая сортировка вместо rand. На сайтах с объектным кэшем блок практически не влияет на скорость.
Сколько похожих записей выводить?
Оптимально от трёх до шести. Три карточки не перегружают страницу и хорошо смотрятся на мобильном, шесть — предел, после которого читатель перестаёт воспринимать блок. Десять и больше ссылок не дают дополнительных переходов, зато утяжеляют вёрстку и размывают вес внутренних ссылок.
Влияют ли связанные записи на SEO?
Да, косвенно. Они создают осмысленную внутреннюю перелинковку, помогают поисковым системам понять связи между материалами и повышают глубину просмотра, что отражается в поведенческих факторах. Прямого роста позиций от блока ждать не стоит, но в связке с корректной структурой рубрик и картой сайта он работает на общий результат.
Почему блок похожих статей пустой?
Чаще всего потому, что запрос ищет по меткам, а у записи их нет, или потому что в рубрике нет других опубликованных материалов. Другие причины: в post__not_in передан неверный идентификатор, в цикле используется неправильная переменная, либо блок просто не вставлен в нужный шаблон. Надёжное решение — предусмотреть откат на рубрики, если метки отсутствуют.
Вывод
Связанные записи — небольшой блок, который решает сразу три задачи: удерживает читателя, распределяет внутренний вес между страницами и показывает поисковым системам структуру контента. В WordPress его собирают либо плагином, либо своим кодом, и выбор зависит не от сложности задачи, а от требований к скорости и виду блока.
Практический порядок действий такой. Определите критерий подбора — рубрики, метки или своя таксономия. Соберите список из 3–6 материалов с исключением текущей записи. Закэшируйте результат через transient, если проекта больше нескольких десятков статей. Сверстайте карточки с миниатюрами и проверьте их на телефоне. И не забывайте сбрасывать глобальный запрос, если использовали WP_Query.
Если нужен блок связанных записей под ваш шаблон, доработка темы или ускорение уже существующего сайта, эту задачу можно передать команде. Мы пишем код под конкретную тему, настраиваем кэширование и проверяем результат на реальном трафике. Посмотрите услуги разработки и доработки сайтов, изучите портфолио выполненных проектов и почитайте блог о WordPress и разработке. Опишите задачу через форму контактов — предложим решение и рассчитаем стоимость.



