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