Диагностика проблемы с параметром paged в WP_Query
При работе с WP_Query параметр paged отвечает за текущую страницу пагинации. В простых запросах пагинация работает корректно, но при комплексных запросах с несколькими дополнительными параметрами (например, meta_query, tax_query, orderby, posts_per_page) часто возникает ошибка 404 или пагинация не переключается на нужную страницу.
Причина — неправильная установка или использование параметра paged в запросе, либо конфликт с глобальным объектом $wp_query, что приводит к несоответствию между URL и самим запросом.
Как правильно получить параметр paged из запроса
Частая ошибка — жёсткое присваивание $paged = get_query_var('paged'); без учёта того, что параметр может быть передан через page в URL, особенно если используется статическая главная страница или настраиваются сложные маршруты.
Рекомендуемый способ получить текущую страницу:
if ( get_query_var('paged') ) {
$paged = get_query_var('paged');
} elseif ( get_query_var('page') ) {
$paged = get_query_var('page');
} else {
$paged = 1;
}Пример корректного комплексного запроса WP_Query с paged
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = [
'post_type' => 'product',
'posts_per_page' => 10,
'paged' => $paged,
'meta_query' => [
[
'key' => '_price',
'value' => 1000,
'compare' => '>=',
'type' => 'NUMERIC'
]
],
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'electronics'
]
],
'orderby' => 'date',
'order' => 'DESC'
];
$query = new WP_Query($args);Обратите внимание, что paged всегда передаётся в аргументах запроса.
Как правильно использовать пагинацию в шаблоне
Если используете собственную пагинацию или плагин, например WP-PageNavi, убедитесь, что он получает экземпляр вашего запроса, а не глобальный $wp_query.
if ( function_exists('wp_pagenavi') ) {
wp_pagenavi(['query' => $query]);
} else {
// Вариант без плагина
echo paginate_links([
'total' => $query->max_num_pages,
'current' => $paged,
]);
}Проверка результата после внедрения
- На странице с пагинацией URL должен корректно содержать параметр
/page/2/(или аналогичный). - Переход по страницам пагинации не должен приводить к ошибке 404.
- Контент на странице меняется согласно номеру страницы (например, меняется список товаров или постов).
- В коде страницы (через
var_dump($paged)или дебаг) отображается правильный номер текущей страницы.
Частые ошибки и их исправление
- Ошибка 404 при переходе по страницам пагинации
Причина: неправильный параметрpagedили конфликт с пермалинками.
Решение: проверить получениеpagedчерезget_query_var('paged')иget_query_var('page'), обновить настройки постоянных ссылок (пересохранить в админке). - Пагинация не переключается, всегда показывается первая страница
Причина: параметрpagedне передаётся в WP_Query или используется глобальный$wp_query, а не ваш кастомный запрос.
Решение: обязательно передаватьpagedв аргументах и использовать пагинацию для текущего объекта запроса. - Несоответствие количества постов и страниц
Причина: множественные запросы на странице без правильного сбросаwp_reset_postdata().
Решение: всегда вызывайтеwp_reset_postdata()после кастомного запроса.
Практические советы по производительности и безопасности
- Для комплексных запросов с большим количеством фильтров используйте индексацию мета-полей в базе данных для ускорения
meta_query. - Используйте
no_found_rows => trueв WP_Query, если пагинация не нужна, чтобы ускорить запросы. - Всегда сбрасывайте глобальные переменные после кастомных запросов:
wp_reset_postdata(). - Для пагинации AJAX делайте валидацию параметра
paged, чтобы избежать SQL-инъекций.
Сравнение вариантов реализации пагинации комплексных запросов
| Подход | Плюсы | Минусы |
|---|---|---|
| WP_Query с правильным paged | Контроль над запросом, совместимость с WP-PageNavi, SEO-дружелюбно | Сложность настройки при множестве фильтров |
| Использование глобального $wp_query | Простота в базовых случаях | Не подходит для нескольких запросов на странице, ошибки пагинации |
| AJAX пагинация | Быстрая загрузка без перезагрузки страницы | Нужно дополнительное программирование, правильная обработка query vars |