Диагностика проблемы: почему пагинация не работает при WP_Query
Одной из частых проблем при создании пользовательских запросов через WP_Query является неработающая или некорректная пагинация. Например, при переходе на следующую страницу пагинации URL меняется, но контент не обновляется, либо отображается 404 ошибка. Основные причины обычно связаны с неправильной настройкой параметров запроса, конфликтом с глобальной переменной $paged или ошибками в структуре ссылок (Permalinks).
Что проверить в первую очередь?
- Правильно ли передается номер текущей страницы в параметре
pagedзапроса WP_Query. - Используется ли глобальная переменная
$pagedи корректно ли она инициализирована. - Совместимы ли настройки постоянных ссылок с пагинацией (например, включен ли режим «Произвольные ссылки»).
- Не конфликтует ли ваш кастомный запрос с основным запросом WordPress (main query).
Пошаговое решение корректной пагинации в WP_Query
1. Получаем текущую страницу
Обязательно используйте глобальную переменную $paged и проверяйте её наличие. Вот проверенный шаблон:
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
При создании запроса указывайте параметр paged с полученным значением:
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged
);
$custom_query = new WP_Query($args);3. Построение пагинации
Для вывода навигации используйте функцию paginate_links(), передавая все необходимые параметры:
$big = 999999999; // числовой плейсхолдер для замены
echo paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, $paged),
'total' => $custom_query->max_num_pages
));4. Поддержка пользовательских типов записей и таксономий
Если пагинация не работает для кастомных типов записей или архивов таксономий, убедитесь, что в functions.php для регистрации CPT указан параметр 'has_archive' => true, и что для таксономий правильно настроены rewrite правила.
Проверка результата после внедрения
Чтобы проверить корректность работы пагинации, выполните следующие действия:
- Откройте страницу с пользовательским запросом и пагинацией.
- Проверьте, что URL при переходе на следующую страницу меняет параметр
paged(например, /page/2/). - Убедитесь, что контент меняется в соответствии с номером страницы.
- Проверьте, что не возникает ошибок 404 или пустых страниц.
- Просмотрите исходный код пагинации, чтобы ссылки были сформированы корректно.
Частые ошибки и способы их исправления
- Игнорирование
pagedв запросе: Если не передатьpagedв WP_Query, пагинация не будет работать. Решение — всегда передавайте параметр. - Неправильное получение номера страницы: Использование
get_query_var('paged')без проверкиget_query_var('page')может приводить к ошибкам, особенно на главной странице или в статических страницах. - Конфликт с main query: Запросы, созданные без
wp_reset_postdata()после вывода, могут ломать пагинацию. Не забывайте сбрасывать глобальные данные. - Проблемы с постоянными ссылками: Если структура ссылок не поддерживает пагинацию, может возникать 404. Решение — перейти в настройки «Постоянные ссылки» и сохранить их заново.
Практические советы по оптимизации и безопасности
- Для больших сайтов используйте
posts_per_pageне больше 10-20, чтобы не нагружать сервер. - Применяйте кеширование страниц пагинации (например, через плагин Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wppagenavi.ru&utm_medium=article&utm_campaign=kak-ispravit-ne-rabotayushhuyu-paginaciyu-pri-polzovatelnyh-zaprosah-wp_query) для повышения производительности.
- Избегайте дублирующего контента на страницах пагинации, корректно настраивая мета-теги
rel="canonical". - Всегда вызывайте
wp_reset_postdata()после кастомного запроса, чтобы не влиять на основной цикл WordPress.
Сравнение способов реализации пагинации для WP_Query
| Способ | Преимущества | Недостатки |
|---|---|---|
| Ручная настройка с WP_Query и paginate_links() | Полный контроль над выводом, гибкость | Требует знания WP API, больше кода |
| Плагины (например, WP-PageNavi) | Простота установки, готовый функционал | Может конфликтовать с кастомными запросами, ограниченная кастомизация |
| AJAX пагинация | Улучшенный UX, без перезагрузки страницы | Сложнее в реализации, требует JS и серверной логики |