WP_Query — это мощный класс WordPress, который позволяет получать посты по сложным условиям. В этой статье мы подробно разберем, как сделать круговой вывод листингов (постов) с помощью WP_Query, чтобы на сайте постоянно показывались новые записи без дублирования и с плавным переходом по страницам.
Что такое круговой вывод листингов и зачем он нужен
Круговой вывод — это когда после достижения конца списка публикаций происходит возврат к началу, и показ продолжается заново. Такой подход полезен для сайтов с каталогами, портфолио, отзывами, где хочется, чтобы пользователь всегда видел контент без остановки на последней статье.
Реализация кругового вывода позволяет:
- Поддерживать непрерывный показ контента;
- Избегать пустых страниц в пагинации;
- Увеличить время взаимодействия пользователя с сайтом.
В WordPress по умолчанию пагинация заканчивается на последней странице. Чтобы сделать круговой вывод, потребуется кастомная логика с использованием WP_Query.
Настройка WP_Query для кругового вывода листингов
Основная идея — отслеживать номер текущей страницы, и при достижении максимума — возвращаться к первой. Рассмотрим пример.
Получение общего количества страниц
Для начала создадим запрос, чтобы узнать, сколько всего страниц доступно:
function wp_course_get_total_pages($posts_per_page) {
$args = [
'post_type' => 'post',
'posts_per_page' => $posts_per_page,
'post_status' => 'publish',
];
$query = new WP_Query($args);
return $query->max_num_pages;
}Здесь мы получаем максимальное число страниц, исходя из общего количества постов.
Круговой вывод с использованием номера страницы
Далее нужно реализовать функцию, которая вычисляет текущую страницу с циклом:
function wp_course_get_circular_page($current_page, $max_pages) {
if ($current_page > $max_pages) {
return 1; // возвращаемся к первой странице
} elseif ($current_page < 1) {
return $max_pages; // если меньше первой, показываем последнюю
}
return $current_page;
}Теперь применим эту функцию при создании WP_Query:
$posts_per_page = 5;
$current_page = get_query_var('paged') ? get_query_var('paged') : 1;
$max_pages = wp_course_get_total_pages($posts_per_page);
$circular_page = wp_course_get_circular_page($current_page, $max_pages);
$args = [
'post_type' => 'post',
'posts_per_page' => $posts_per_page,
'paged' => $circular_page,
'post_status' => 'publish',
];
$query = new WP_Query($args);Реализация пагинации с циклом
Важно правильно организовать ссылки пагинации, чтобы при достижении конца навигация возвращалась к первой странице.
Создание кастомной пагинации
Пример функции пагинации с учетом кругового вывода:
function wp_course_circular_pagination($max_pages, $current_page) {
$prev_page = ($current_page - 1) < 1 ? $max_pages : ($current_page - 1);
$next_page = ($current_page + 1) > $max_pages ? 1 : ($current_page + 1);
echo '<nav class="wp-course-pagination">';
echo '<a href="' . get_pagenum_link($prev_page) . '" class="prev">« Предыдущая</a>';
echo '<span>Страница ' . $current_page . ' из ' . $max_pages . '</span>';
echo '<a href="' . get_pagenum_link($next_page) . '" class="next">Следующая »</a>';
echo '</nav>';
}Вызовите эту функцию после вывода постов:
wp_course_circular_pagination($max_pages, $circular_page);Пример полного шаблона с круговым выводом
Объединим все вместе в простом шаблоне:
<?php
$posts_per_page = 5;
$current_page = get_query_var('paged') ? get_query_var('paged') : 1;
$max_pages = wp_course_get_total_pages($posts_per_page);
$circular_page = wp_course_get_circular_page($current_page, $max_pages);
$args = [
'post_type' => 'post',
'posts_per_page' => $posts_per_page,
'paged' => $circular_page,
'post_status' => 'publish',
];
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
?>
<article id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="entry-content"><?php the_excerpt(); ?></div>
</article>
<?php
endwhile;
wp_course_circular_pagination($max_pages, $circular_page);
wp_reset_postdata();
else :
echo '<p>Посты не найдены.</p>';
endif;
?>Советы по оптимизации и совместимости
Чтобы пагинация работала корректно с разными типами постов и фильтрами, учтите следующие моменты:
- Учитывайте параметры запроса (категории, метки), чтобы подсчет страниц был валидным.
- При использовании плагинов кэширования сбрасывайте кэш для страниц пагинации.
- Проверяйте, что get_query_var('paged') корректно возвращает номер страницы, особенно на главной странице.
Для более сложных кейсов можно расширить логику, например, добавлять ajax-загрузку или интегрировать с плагином ABC Pagination (подробнее на WPSHOP).
Заключение
Реализация кругового вывода листингов с помощью WP_Query — это полезный прием для улучшения удобства пользователя и удержания внимания на сайте. С помощью простых функций и корректной пагинации вы сможете добиться плавного и бесконечного показа контента. Приведенный пример легко адаптируется под ваши нужды и расширяется для любых типов записей.