Пагинация при пользовательском запросе WP_Query на странице поиска search
Столкнулся с проблемой работы пагинации при выполнении пользовательского запроса WP_Query. Поиск осуществляется по произвольным полям [meta_query].
В чём проблема: после выполнения произвольного запроса формируются результаты поиска на странице, как и положено. Внизу выводится пагинация, но как только переходишь на вторую страницу, то получаешь сообщение - ничего не найдено.
Первая страница поиска : сайт.ру/search/page/2/?city=par_1&type_of_room=par_2(работает)
Вторая страница поиска: сайт.ру/search/page/2/?city=par_1&type_of_room=par_2 (не работает)
P.S: Значения для массива $_GET сохраняются в адресной строке при переходе на другую страницу пагинации. Но когда его пытаешься вывести массив $_GET при помощи print_r() или var_dump() на следующей странице, он пустой.
Форма поиска:
// Город $city = (string)trim(htmlspecialchars($_GET['city'])); // Имя категории $type_of_room = (string)trim(htmlspecialchars($_GET['type_of_room'])); <form action="<?php echo esc_url(home_url('/search')); ?>" method="GET"> <label for="l_city">Населенный пункт:</label> <input type="text" name="city" value="<?php if(!empty($city)){echo $city;} ?>" maxlength="30" id="l_city" placeholder="Название города"> <label for="l_type_of_room">Тип квартиры:</label> <select name="type_of_room" id="l_type_of_room"> <option value="">Не указано</option> <option value="studio" <?php echo selected($type_of_room, 'studio'); ?>>Студия</option> <option value="1r" <?php echo selected($type_of_room, '1r'); ?>>1 комната</option> <option value="2r" <?php echo selected($type_of_room, '2r'); ?>>2 комнаты</option> <option value="3r" <?php echo selected($type_of_room, '3r'); ?>>3 комнаты</option> <option value="4r" <?php echo selected($type_of_room, '4r'); ?>>4 комнаты</option> <option value="5r" <?php echo selected($type_of_room, '5r'); ?>>5 комнат</option> </select> <input type="submit" value="Применить"> <span class="reset-form">Сбросить</span> </form>
Массив для WP_Query:
Массив формируется в файле functions.php в функции my_search_query().
function my_search_query () { $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; # Основные параметры запроса $args = array( 'paged' => $paged, 'posts_per_page' => '2', // Выводим все записи на одной странице 'post_type' => 'post', // Только записи с пометкой пост 'post_status' => 'publish', // Только опубликованные объявления 'author__not_in' => '-1', // Исключаем посты администратора 'order by' => 'date', // сортируем по дате записи 'order' => 'DESC', // сортировка в порядке убывания ); # Добавляем в основной массив, массив для meta-полей $args['meta_query'] = array(); # Динамические параметры запроса // Имя категории, в которой будет происходить поиск if(isset($_GET['type_of_room']) && !empty($_GET['type_of_room']) ){ $args['category_name'] = (string)trim(htmlspecialchars($_GET['type_of_room'])); }else{ unset($_GET['type_of_room']); } // Город if(isset($_GET['city']) && !empty($_GET['city']) ){ $args['meta_query']['address_rent_object'] = array( 'key' => 'address_rent_object', 'compare' => 'LIKE', 'value' => (string)trim(htmlspecialchars($_GET['city'])), 'type' => 'CHAR' ); }else{ unset($_GET['city']); } return new WP_Query($args); }
Страница на которой выводятся результаты поиска:
Страница определена при помощи шаблона: / Template Name: Search /
// Если существует переменная $_GET и она не пустая if(isset($_GET) && !empty($_GET)){ $query = my_search_query(); if($query->have_posts() ){ while($query->have_posts()){ $query->the_post(); the_title(); } # Источник: https://wp-kama.ru/function/paginate_links echo paginate_links( array( 'base' => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ), 'total' => $query->max_num_pages, 'current' => max( 1, get_query_var( 'paged' ) ), 'format' => '?paged=%#%', 'show_all' => false, 'type' => 'plain', 'end_size' => 2, 'mid_size' => 1, 'prev_next' => true, 'prev_text' => 'Prev', 'next_text' => 'Next', 'add_args' => false, 'add_fragment' => '', ) ); // // восстанавливаем глобальную переменную $post wp_reset_postdata(); } else { // текст/код, если постов нет echo ' <!-- Объявлений не найдено --> <div class="no-list-flat"> <p>По вашему запросу ничего не найдено.</p> <p>Попробуйте изменить параметры и повторить поиск.</p> </div>'; } }else{ echo ' <div class="no-list-flat"> <p>По вашему запросу ничего не найдено.</p> <p>Попробуйте изменить параметры и повторить поиск.</p> </div>'; }
Пробовал этот вариант, не работает. Также определял и глобальные переменные wp_query и paged, тоже не сработало.
А есть ли разница в том, что у меня стандартный шаблон search.php не определен 9не создан). И пользовательский запрос я перенаправляю на страницу, которую определил при помощи шаблона template name и присвоил ей имя сайт.ру/search. Возможен ли здесь конфликт?
UPD: как раз таки проблемы была в том, что описал выше.
В get_query_var('paged')
было пусто, ЧПУ Правила не парсили такой УРЛ /search/page/X/
?
нет, не парсили такой УРЛ
Код просмотрел быстро - выглядит рабочим. Попробуй вместо
paged
заюзатьpage
вот тут:get_query_var('paged')
.