Сброс пагинации после поискового запроса.
Имеется проблема с тем что после поиска на сайте попадаю на 404 страницу с имеющимися результатами. Проблема в том что если пользователь совершил переход на другие страницы в архиве записей и делает поиск, количество результатов, к примеру, меньше 10, а мы находимся на странице 3, в итоге мы и оказываемся на 404 странице.
LIMIT 20, 10
Пробовал использовать сохранение поискового запроса в $_COOKIE и при его изменениях сбрасывать параметр paged:
$query->set('paged', 1);
Но это решение не работает с woocommerce, пагинация остаётся на странице 1, а url остаётся на прежней странице.
На кастомных постах это работает. Эта проблема преследуем меня уже не первый раз.
Как можно решить эту проблему или что я делаю не так?
$searchValue = $query->query_vars['s']; if (empty($_COOKIE['search_phrase'])) { $_COOKIE['search_phrase'] = ""; } $meta_query_args = array( 'relation' => 'OR', [ 'key' => '_sku', 'value' => $searchValue, 'compare' => 'LIKE', ] ); $query->set('meta_query', $meta_query_args); if ($searchValue != $_COOKIE['search_phrase'] && $_COOKIE['search_phrase'] != "") { $query->set('paged', 1); } $_COOKIE['search_phrase'] = $searchValue;
Поменял $_COOKIE на $_SESSION, вроде работает.
При чем тут $_SESSION, вп не работает с сессиями по умолчанию. Что-то у вас там не то...
Действительно не работает. И теперь я уверен что у меня что-то не так.
Для модификации WP_Query использую хук 'pre_get_posts'.
Ответ от ГПТ, не знаю может поможет что-то.
Проблема, с которой вы столкнулись, связана с тем, что при выполнении поиска на сайте, находясь на пагинированной странице (например, страница 3), параметр paged остаётся в URL. Если результаты поиска содержат меньше страниц, чем текущее значение paged, WordPress (или WooCommerce) пытается отобразить несуществующую страницу, что приводит к ошибке 404.
Почему текущее решение не работает:
Решение: сброс параметра paged при новом поиске
Чтобы исправить проблему, нужно убедиться, что параметр paged сбрасывается при выполнении нового поиска. Вот несколько вариантов решения:
1. Использование фильтра request для сброса paged
Фильтр request позволяет изменять параметры запроса до выполнения главного запроса. Сбросив paged в 1 при выполнении поиска, вы избежите ошибки 404.
Объяснение:
2. Редирект для удаления paged из URL (опционально)
Если сброс paged в запросе не работает из-за обработки WooCommerce, можно удалить paged из URL при выполнении поиска.
Объяснение:
3. Изменение формы поиска для исключения paged
Ещё один подход — убедиться, что параметр paged не включается при выполнении поиска.
Модификация действия формы поиска:
Использование JavaScript для удаления paged при отправке формы:
4. Настройка запроса WooCommerce
Так как WooCommerce может по-другому обрабатывать запросы, нужно напрямую изменить его параметры.
Объяснение: