Плагин YARPP (Yet Another Related Posts Plugin) — это один из самых популярных инструментов для вывода связанных записей в WordPress. Однако, по умолчанию YARPP выводит все связанные записи без разбивки на страницы, что может негативно сказаться на производительности сайта и удобстве пользователей, особенно если количество связанных записей велико.
Почему важна пагинация для связанных записей в YARPP
Если на странице статьи выводить сразу большое количество связанных записей, это может привести к:
- Увеличению времени загрузки страницы из-за большого объема запросов к базе данных.
- Потере удобства для пользователя — слишком длинный блок с записями сложно воспринимать.
- Проблемам с SEO — избыточный контент и дублирование могут ухудшить индексацию.
Пагинация позволяет разбивать список связанных записей на удобные страницы, улучшая юзабилити и снижая нагрузку.
Как реализовать пагинацию для YARPP: обзор вариантов
Стандартный функционал YARPP не включает поддержку разбивки на страницы. Чтобы добавить пагинацию, можно использовать несколько подходов:
1. Кастомная реализация с WP_Query и YARPP API
YARPP предоставляет функцию yarpp_get_related(), которая возвращает массив ID связанных записей. На основе этого массива можно создать собственный WP_Query с параметрами пагинации.
Пример кода:
function yarppru_get_related_with_pagination($post_id, $posts_per_page = 5, $paged = 1) {
// Получаем ID связанных записей
$related_ids = yarpp_get_related($post_id, ['limit' => 100, 'post_type' => 'post']);
if (empty($related_ids)) {
return null;
}
// Подсчет общего количества
$total_related = count($related_ids);
// Вычисляем срез массива для текущей страницы
$offset = ($paged - 1) * $posts_per_page;
$paged_related_ids = array_slice($related_ids, $offset, $posts_per_page);
// Создаем WP_Query
$args = [
'post__in' => $paged_related_ids,
'orderby' => 'post__in',
'posts_per_page' => $posts_per_page,
'paged' => $paged
];
$query = new WP_Query($args);
return [$query, $total_related];
}В шаблоне выводите записи из $query, а ниже — навигацию по страницам, рассчитывая общее число страниц как ceil($total_related / $posts_per_page).
2. Использование плагинов для пагинации
Если не хочется писать код, можно найти плагины, расширяющие YARPP поддержкой пагинации. Однако таких решений мало, и они могут быть неактуальны.
3. AJAX-подгрузка связанных записей
Более современный подход — выводить первые N записей сразу, а остальные загружать по нажатию кнопки через AJAX. Это повышает отзывчивость страницы и снижает нагрузку.
Пример простого AJAX-запроса для подгрузки следующих связанных записей:
jQuery(document).ready(function($) {
$('#load-more-related').on('click', function() {
var data = {
action: 'yarppru_load_more',
post_id: $(this).data('post'),
paged: $(this).data('paged') + 1
};
$.post(ajaxurl, data, function(response) {
if(response) {
$('#related-posts-container').append(response);
$('#load-more-related').data('paged', data.paged);
} else {
$('#load-more-related').hide();
}
});
});
});Для обработки запроса на сервере регистрируем AJAX-хук, который использует yarpp_get_related(), чтобы получить следующие записи.
Подробная инструкция по реализации пагинации YARPP с кодом
Для примера рассмотрим вариант с WP_Query и разбиением массива связанных записей. В functions.php темы или плагина добавьте функцию:
function yarppru_related_posts_with_pagination() {
global $post;
$paged = isset($_GET['related_page']) ? intval($_GET['related_page']) : 1;
$posts_per_page = 5;
list($query, $total_related) = yarppru_get_related_with_pagination($post->ID, $posts_per_page, $paged);
if (!$query || !$query->have_posts()) {
echo '<p>Связанных записей не найдено.</p>';
return;
}
echo '<div class="yarpp-related-posts">';
while ($query->have_posts()) {
$query->the_post();
echo '<div class="related-post-item">';
echo '<a href="' . get_permalink() . '">' . get_the_title() . '</a>';
echo '</div>';
}
echo '</div>';
// Навигация
$total_pages = ceil($total_related / $posts_per_page);
if ($total_pages > 1) {
echo '<nav class="yarpp-pagination">';
for ($i = 1; $i <= $total_pages; $i++) {
if ($i == $paged) {
echo '<span class="current-page">' . $i . '</span>';
} else {
$url = add_query_arg('related_page', $i);
echo '<a href="' . esc_url($url) . '">' . $i . '</a>';
}
}
echo '</nav>';
}
wp_reset_postdata();
}В шаблоне single.php подключите вывод так:
<?php yarppru_related_posts_with_pagination(); ?>Советы по оптимизации и настройке YARPP с пагинацией
Для корректной работы и производительности учтите следующие моменты:
- Устанавливайте разумный лимит для
yarpp_get_related(), чтобы не загружать лишние записи. - Кешируйте результаты запросов, например, с помощью Transients API, чтобы не генерировать связанные записи на каждом запросе.
- Проверяйте совместимость с темой и другими плагинами, чтобы не было конфликтов отображения и стилей.
- Используйте CSS для удобного отображения пагинации и адаптации под мобильные устройства.
Альтернативные плагины и инструменты для связанных записей с пагинацией
Если YARPP кажется слишком сложным для кастомной пагинации, рассмотрите альтернативы:
- Contextual Related Posts — поддерживает вывод связанных записей с пагинацией и кешированием.
- Related Posts for WordPress — простой и современный плагин с возможностью пагинации.
Но если вы хотите гибко контролировать алгоритмы и внешний вид, то YARPP с кастомной пагинацией — лучший вариант.
Заключение
Добавление пагинации в YARPP — это практическое решение, которое повышает удобство пользователей и оптимизирует нагрузку на сервер. Используя yarpp_get_related() и WP_Query, можно реализовать удобный и быстрый вывод связанных записей с разбивкой на страницы. Не забывайте про кеширование и тестирование на разных устройствах.