Пагинация для архива кастомного типа записей в WordPress

Пагинация – важный элемент удобной навигации по спискам записей на сайте. Для стандартных типов записей WordPress автоматически генерирует пагинацию на страницах архивов. Но при работе с кастомными типами записей (Custom Post Types) иногда возникают сложности с корректной работой пагинации, особенно если архив кастомного типа настроен нестандартно.

Почему пагинация кастомного типа записей может не работать

Основные причины проблем с пагинацией в архивах кастомных типов:

  • Неправильно указан параметр paged в запросах WP_Query или query_posts.
  • Не установлен параметр 'has_archive' => true при регистрации кастомного типа.
  • Отсутствие правильных правил перезаписи (rewrite rules) для URL архивов.
  • Использование нестандартных шаблонов без поддержки пагинации.

Разберём эти моменты подробнее и приведём рабочие примеры.

Правильная регистрация кастомного типа записей для архива с пагинацией

Для начала, при регистрации кастомного типа убедитесь, что у него включён архив и настроен правильный rewrite. Например:

function wplab_register_custom_post_type() {
    $args = [
        'label' => 'Проекты',
        'public' => true,
        'has_archive' => true, // Включаем архив
        'rewrite' => [
            'slug' => 'projects',
            'with_front' => false
        ],
        'supports' => ['title', 'editor', 'thumbnail'],
    ];
    register_post_type('project', $args);
}
add_action('init', 'wplab_register_custom_post_type');

Без has_archive => true WordPress не будет генерировать страницу архива для типа project. Параметр rewrite задаёт ЧПУ для архива: site.ru/projects/.

Создание шаблона архива с корректной пагинацией

Для вывода архива кастомного типа создайте файл archive-project.php в вашей теме. Важно, чтобы в запросе пагинация учитывалась правильно. Пример простого шаблона с пагинацией:

<?php
get_header();

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = [
    'post_type' => 'project',
    'posts_per_page' => 5,
    'paged' => $paged
];
$wplab_query = new WP_Query($args);

if ($wplab_query->have_posts()) :
    while ($wplab_query->have_posts()) : $wplab_query->the_post();
        ?>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <div><?php the_excerpt(); ?></div>
        <?php
    endwhile;

    // Пагинация
    echo paginate_links([
        'total' => $wplab_query->max_num_pages,
        'current' => $paged,
        'mid_size' => 2,
        'prev_text' => '« Назад',
        'next_text' => 'Вперед »'
    ]);

    wp_reset_postdata();
else :
    echo '<p>Записей не найдено.</p>';
endif;

get_footer();
?>

Это стандартный способ вывести архив с пагинацией. Обратите внимание, что параметр paged передаётся в WP_Query — без него пагинация работать не будет.

Особенности get_query_var('paged')

Функция get_query_var('paged') возвращает номер текущей страницы пагинации. Если находитесь на первой странице — значение будет 0 или 1. Это важно правильно обработать, чтобы запрос показывал нужный набор записей.

Использование нативного запроса WordPress для архива

Вместо создания нового запроса можно работать с основным запросом WordPress, если вы используете стандартный файл archive-project.php. Для этого в начале файла ничего не меняйте, а просто выводите цикл как обычно:

<?php
get_header();

if (have_posts()) :
    while (have_posts()) : the_post();
        ?>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <div><?php the_excerpt(); ?></div>
        <?php
    endwhile;

    the_posts_pagination([
        'mid_size' => 2,
        'prev_text' => '« Назад',
        'next_text' => 'Вперед »'
    ]);
else :
    echo '<p>Записей не найдено.</p>';
endif;

get_footer();
?>

Для этого нужно, чтобы в URL была правильная структура архивов и не было конфликтов с правилами перезаписи.

Отладка и проверка работы пагинации

Если пагинация не работает, проверьте следующие моменты:

  • Сбросьте правила перезаписи (перейдите в админке к Настройки -> Постоянные ссылки и нажмите «Сохранить изменения» без изменений).
  • Проверьте, что параметр paged передаётся в WP_Query.
  • Убедитесь, что при регистрации кастомного типа включён has_archive и правильно задан rewrite.
  • Проверьте, нет ли конфликтов с другими плагинами, которые могут вмешиваться в запросы.

Примеры полезных плагинов для работы с кастомными типами и пагинацией

Для удобства работы с кастомными типами записей и пагинацией можно использовать плагины:

  • Clearfy Pro — оптимизация и устранение конфликтов, может помочь с корректной работой запросов и пагинации.
  • ABC Pagination — модульная пагинация с расширенными настройками, отлично подходит для кастомных архивов.

Практическая функция для корректного определения номера страницы пагинации в WPLab

Часто встречается проблема с определением текущей страницы пагинации. Предлагаю пример функции с префиксом wplab_, чтобы всегда корректно получать номер страницы:

function wplab_get_paged() {
    if (get_query_var('paged')) {
        return get_query_var('paged');
    } elseif (get_query_var('page')) {
        return get_query_var('page');
    } else {
        return 1;
    }
}

Используйте эту функцию вместо прямого вызова get_query_var('paged') при создании WP_Query, чтобы избежать ошибок пагинации на разных шаблонах.

Итоги

Пагинация для кастомных типов записей в WordPress — задача, которую можно решить с помощью правильной регистрации типов, корректных запросов и шаблонов. Обязательно учитывайте параметры paged и has_archive, а также следите за правилами перезаписи. В случае проблем используйте отладку и плагины, упрощающие работу с кастомными архивами.

Как изменить вывод сообщений об ошибках в WordPress
04.01.2026
Как изменить URL страницы автора в WordPress без плагинов
20.01.2026
Как автоматически удалять автоматические отзывы в WordPress
11.04.2026
Как отладить и исправить ошибки в WordPress с помощью Debug Mode
10.11.2025
Как создать собственный плагин WordPress: пошаговое руководство
31.10.2025