Пагинация при пользовательском запросе 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').