Как использовать WP_Query для кругового вывода листингов в WordPress

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 — это полезный прием для улучшения удобства пользователя и удержания внимания на сайте. С помощью простых функций и корректной пагинации вы сможете добиться плавного и бесконечного показа контента. Приведенный пример легко адаптируется под ваши нужды и расширяется для любых типов записей.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как сделать уникальные поля для медиа в WordPress: практическое руководство
05.02.2026
Как добавить уникальные поля в WordPress без плагинов: практическое руководство
02.02.2026
Как автоматизировать создание резервных копий WordPress: лучшие плагины и примеры кода
03.12.2025
Как создать свой плагин WordPress с нуля: пошаговое руководство для разработчиков
06.11.2025
Работа с хуками и фильтрами в WordPress — подробное руководство с примерами
25.11.2025