В чем проблема с пагинацией при использовании WP_Query и параметра paged?
При создании пользовательских запросов через класс WP_Query часто возникает ситуация, когда пагинация не работает: ссылки на страницы либо ведут на 404 ошибку, либо список записей не меняется при переключении страниц. Основная причина — некорректная передача параметра paged, отвечающего за текущую страницу пагинации, и неправильная организация запроса.
Особенно это актуально для кастомных шаблонов, архивов и сложных запросов с фильтрами.
Диагностика проблем с пагинацией WP_Query
- Проверить, правильно ли передается значение
pagedиз URL. Обычно это GET-параметрpagedилиpageдля страниц. - Убедиться, что
WP_Queryполучает параметрpagedв аргументах. - Проверить настройки постоянных ссылок (Permalinks). Иногда пагинация ломается при дефолтных настройках.
- Посмотреть, нет ли конфликтов с другими плагинами, которые могут изменять глобальный запрос.
- Проверить, что параметры
posts_per_pageиpagedне конфликтуют.
Пошаговое решение: настройка правильной пагинации с WP_Query
1. Получаем текущую страницу пагинации
if ( get_query_var('paged') ) {
$paged = get_query_var('paged');
} elseif ( get_query_var('page') ) { // для страниц
$paged = get_query_var('page');
} else {
$paged = 1;
}Важно использовать оба варианта, так как WordPress иногда по-разному передает параметры пагинации для страниц и постов.
2. Создаем WP_Query с передачей параметра paged
$args = array(
'post_type' => 'post', // или кастомный тип записи
'posts_per_page' => 10,
'paged' => $paged,
// другие параметры запроса
);
$custom_query = new WP_Query($args);3. Выводим посты и пагинацию
if ($custom_query->have_posts()) :
while ($custom_query->have_posts()) : $custom_query->the_post();
// Ваш вывод постов
the_title('<h2>', '</h2>');
endwhile;
// Пагинация
echo paginate_links(array(
'total' => $custom_query->max_num_pages,
'current' => $paged,
'format' => '?paged=%#%',
'prev_text' => '« Назад',
'next_text' => 'Вперед »',
));
wp_reset_postdata();
else :
echo '<p>Посты не найдены.</p>';
endif;Проверка результата после внедрения
- Перейдите на страницу, где реализован кастомный запрос с пагинацией.
- Кликните по номерам страниц пагинации, убедитесь, что URL меняется на
site.ru/page/2/илиsite.ru/?paged=2и что список постов обновляется. - Отсутствие 404 ошибки при переходе на следующую страницу.
- При отключении параметра
pagedпагинация перестанет работать, значит, параметр передается корректно.
Частые ошибки при настройке пагинации WP_Query
- Не передан параметр paged: приводит к постоянному выводу первой страницы.
- Использование
query_posts()вместоWP_Queryбез сброса глобального запроса. - Конфликт с глобальным запросом: если на странице используется основной Loop и кастомный, нужно правильно сбрасывать данные через
wp_reset_postdata(). - Неправильный формат ссылок пагинации: в зависимости от настроек постоянных ссылок, параметр
formatвpaginate_links()нужно подгонять под структуру URL. - Проблемы с параметрами permalink: при дефолтных настройках пагинация часто ломается, рекомендуется использовать "Постоянные ссылки" - "Произвольно" или "Название записи".
Практические советы по производительности и безопасности
- Для снижения нагрузки на базу данных используйте кеширование запросов, например, через Transients API или встроенные кеширующие плагины.
- При больших объемах данных оптимизируйте запросы, добавляя индексы в базу и фильтруя по нужным полям.
- Используйте
esc_url()и другие функции WordPress для безопасности URL пагинации. - Если используется AJAX пагинация, обязательно валидируйте входящие параметры.
Сравнение вариантов реализации пагинации WP_Query
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Использование параметра paged в WP_Query | Простой, гибкий, стандартный подход | Требует правильного получения paged и сброса postdata | Код из статьи |
| Использование query_posts() | Простой вызов, меняет глобальный запрос | Негативно влияет на производительность, может ломать другие хуки | query_posts(array('paged' => $paged)); |
| Пагинация с WP-PageNavi | Готовое решение со стилями и настройками | Дополнительный плагин, возможны конфликты | Подробнее на WPSHOP |