Связанные записи в WordPress: как вывести похожие статьи

Связанные записи в WordPress: как вывести похожие статьи

Кратко: связанные записи (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.

Когда блок нужен, а когда лучше без него

Связанные записи — не обязательный элемент для любого сайта. Они хорошо работают там, где есть поток однотипного контента: блог с десятками статей, справочный раздел, база знаний, новостная лента, каталог с сотнями товаров, у которых настроены общие таксономии. В этих случаях блок реально увеличивает глубину просмотра.

Плохо он работает на маленьких сайтах: если в блоге восемь статей, любая рекомендация либо повторит уже прочитанное, либо будет случайной. Не стоит ставить блок и туда, где он мешает конверсии: на страницах услуг и в коммерческих лендингах лучше вести посетителя к заявке, а не отвлекать его чтением соседних материалов. И последнее: не подменяйте блоком навигацию — связные разделы сайта должны быть в меню, а не только в автоматических рекомендациях.

Если материалов у вас много, а структура рубрик размыта, сначала наведите порядок в таксономиях — от них напрямую зависит качество подбора, — и только потом включайте блок. Помочь с этим может отдельная задача для разработчика: что можно поручить программисту, описано в материале заказать доработку сайта.

TimeWeb

Частые вопросы про связанные записи в 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 и разработке. Опишите задачу через форму контактов — предложим решение и рассчитаем стоимость.

Clearfy

Поделиться:
Telegram ВКонтакте