Диагностика проблемы с пагинацией в WP_Query
Частая проблема при создании кастомных запросов через WP_Query — это неправильная работа пагинации. Переход по страницам либо ведёт на 404 ошибку, либо выводит всегда одну и ту же страницу. Основная причина — неверное использование параметра paged, который отвечает за текущую страницу пагинации.
Для диагностики используйте следующий чек-лист:
- Правильно ли установлен параметр
pagedиз глобального объекта$pagedилиget_query_var('paged')? - Не перезаписывается ли
pagedвнутри цикла или в параметрах WP_Query? - Не конфликтует ли пагинация с URL-структурой и настройками постоянных ссылок (Permalinks)?
- Вызывается ли
wp_reset_postdata()после цикла для сброса основного запроса?
Пошаговое решение: правильное использование paged в WP_Query
1. Получение текущей страницы пагинации
В шаблоне или функции, где создаётся WP_Query, обязательно получите текущую страницу пагинации из глобальных переменных WordPress:
if ( get_query_var('paged') ) {
$paged = get_query_var('paged');
} elseif ( get_query_var('page') ) { // на случай пагинации на статических страницах
$paged = get_query_var('page');
} else {
$paged = 1;
}2. Передача параметра paged в WP_Query
В массив аргументов WP_Query добавьте параметр paged:
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged
);
$query = new WP_Query($args);3. Вывод пагинации и сброс данных
После цикла выведите пагинацию и вызовите wp_reset_postdata():
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post();
// вывод записи
endwhile;
// пагинация
echo paginate_links(array(
'total' => $query->max_num_pages,
'current' => $paged,
'format' => '?paged=%#%',
'prev_text' => '«',
'next_text' => '»'
));
wp_reset_postdata();
endif;Проверка результата после внедрения решения
Чтобы убедиться, что пагинация работает корректно:
- Перейдите на страницу с кастомным запросом и нажмите на кнопки пагинации.
- URL должен меняться с параметром
?paged=2,?paged=3и т.д. - Контент на странице должен обновляться, отображая записи соответствующей страницы.
- Отсутствуют ошибки 404 при переходе по страницам.
Частые ошибки и как их исправить
1. Параметр paged не передаётся или берётся неверно
Ошибка: $paged всегда равен 1, пагинация не работает.
Исправление: использовать get_query_var('paged') и дополнительно get_query_var('page'), поскольку WordPress может использовать разные переменные в зависимости от типа страницы.
2. Конфликт с настройками постоянных ссылок
Ошибка: переход по страницам пагинации приводит к 404 ошибке.
Исправление: Перейдите в Настройки > Постоянные ссылки и нажмите «Сохранить изменения» без изменений, чтобы сбросить правила перезаписи URL.
3. Не вызван wp_reset_postdata() после цикла
Ошибка: пагинация и основной запрос работают некорректно.
Исправление: всегда вызывайте wp_reset_postdata() после кастомного цикла на WP_Query.
Практические советы по производительности и безопасности пагинации
- Кеширование: Используйте объектное кеширование результатов запросов, если данные не меняются часто. Можно интегрировать кеш через Transients API.
- Ограничение постов на странице: Устанавливайте разумный
posts_per_page, чтобы избежать тяжелых запросов и долгой загрузки. - Фильтрация входных данных: Если параметр
pagedберётся из URL, проверяйте и приводите его к целочисленному типу для предотвращения SQL-инъекций.
Сравнение способов реализации пагинации с WP_Query
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Использование paged с WP_Query |
Простой, нативный, гибкий | Требует правильной передачи параметра | Код из статьи |
| Пагинация через get_posts + manual offset | Простая реализация для мелких выборок | Неэффективно для больших наборов данных | get_posts(['offset' => ($paged-1)*10, 'numberposts' => 10]) |
| Пагинация с WP-PageNavi | Удобный UI, дополнительные опции | Зависимость от плагина | wp_pagenavi(['query' => $query]) |