Диагностика проблемы с пагинацией в WooCommerce при фильтрах и сортировке
Часто при использовании стандартных фильтров WooCommerce (по цене, атрибутам) или сортировки товаров на страницах каталога пагинация перестаёт работать корректно: переход по страницам ведёт на страницу 404 или отображается неправильное количество товаров. Это происходит из-за того, что параметры фильтров не учитываются в запросах пагинации, и WordPress не может корректно построить URL или запрос.
Чтобы убедиться в проблеме, проверьте следующие моменты:
- Переход по страницам пагинации после применения фильтра приводит к ошибке 404.
- При смене сортировки пагинация либо сбрасывается, либо ведёт на некорректные страницы.
- URL пагинации не содержит параметров фильтров или сортировки.
- Используется кастомный WP_Query без правильной обработки параметра
pagedи фильтров.
Почему пагинация ломается при фильтрации и сортировке в WooCommerce
WooCommerce строит пагинацию в зависимости от глобального запроса WordPress ($wp_query). Если фильтры или сортировка реализованы через GET-параметры, но не интегрированы в WP_Query или в rewrite rules, пагинация не учитывает эти параметры.
Также пагинация ломается, если используются кастомные запросы без правильной передачи параметра paged и текущих фильтров.
Пошаговое решение: как исправить пагинацию WooCommerce при фильтрах
1. Убедитесь, что используете стандартные WooCommerce хуки и классы
По возможности не переопределяйте основной запрос товара. Используйте стандартные хуки WooCommerce, чтобы не сломать пагинацию.
2. Правильно обрабатывайте параметр paged в кастомных WP_Query
Если у вас есть кастомный WP_Query на странице архива товаров, всегда передавайте в запрос текущую страницу:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = [
'post_type' => 'product',
'posts_per_page' => 12,
'paged' => $paged,
// другие параметры фильтрации
];
$query = new WP_Query($args);3. Добавьте параметры фильтров в URL пагинации
Если фильтры реализованы через GET-параметры, их нужно передать в пагинацию с помощью paginate_links или в функции, генерирующей ссылки пагинации.
Пример генерации пагинации с сохранением параметров:
$current_page = max(1, get_query_var('paged'));
$base = get_pagenum_link(1) . '%_%';
$paginate_links = paginate_links([
'base' => $base,
'format' => 'page/%#%/',
'current' => $current_page,
'total' => $query->max_num_pages,
'add_args' => $_GET, // сохраняем все GET параметры фильтров
]);
echo $paginate_links;4. Используйте rewrite rules для SEO URL фильтров
Для более чистых URL фильтров и пагинации рекомендуется добавить кастомные rewrite rules, учитывающие параметры фильтров и пагинацию. Это улучшает SEO и избегает конфликтов.
Проверка результата после внедрения
- Примените фильтры на странице каталога товаров.
- Проверьте, что URL пагинации содержит параметры фильтров.
- Перейдите по страницам пагинации и убедитесь, что товары отображаются корректно и нет ошибки 404.
- Проверьте сортировку и повторите проверку пагинации.
Частые ошибки и как их исправить
- Ошибка 404 при переходе по страницам пагинации: не передан параметр
pagedв WP_Query или не настроены rewrite rules. Исправить — добавить параметрpagedи настроить ЧПУ. - Пагинация сбрасывается при смене фильтра: ссылки пагинации не сохраняют GET-параметры фильтров. Исправить — использовать параметр
add_argsвpaginate_linksили вручную добавлять параметры в ссылки. - Неправильное количество страниц: WP_Query не учитывает фильтры, или параметры не добавлены в запрос. Исправить — корректно формировать запрос с условиями фильтрации.
Практические советы по безопасности и производительности
- При обработке GET-параметров фильтров обязательно применяйте очистку данных (например,
sanitize_text_field()) для защиты от XSS и инъекций. - Используйте кеширование результатов запросов, особенно при сложных фильтрах и большом количестве товаров, чтобы снизить нагрузку на базу данных.
- Если используете AJAX-фильтры, пагинацию реализуйте через AJAX с обновлением URL с помощью History API для улучшения UX и SEO.
Сравнение способов реализации пагинации с фильтрами в WooCommerce
| Способ | Плюсы | Минусы | Рекомендуемая ситуация |
|---|---|---|---|
| Стандартные WooCommerce фильтры и пагинация | Простота; совместимость; SEO-дружелюбность | Ограниченные возможности кастомизации | Стандартный магазин без сложных фильтров |
Кастомный WP_Query с передачей параметра paged и add_args | Гибкость; контроль над запросом | Требует знаний; можно сломать пагинацию при ошибках | Кастомные шаблоны товаров, фильтры |
| AJAX-фильтры с пагинацией и History API | Улучшенный UX; плавная навигация | Сложнее в реализации; может влиять на SEO | Современные магазины с большим трафиком |