Отображение результатов поиска на той же странице
Проблема
У меня есть страница на сайте, где мне нужно выполнить дополнительный поиск в пределах этой страницы. Я использую стандартный способ поиска WordPress с помощью <?php get_search_form(); ?>
для основного поиска в шапке, который работает отлично.
Я создал другую HTML-форму на своей странице, не используя стандартный PHP-метод, для дополнительного поиска следующим образом:
<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
<div>
<label for="s" class="screen-reader-text">Искать:</label>
<input type="text" id="s" name="s" value="" />
<input type="hidden" name="post_type" value="photo_group" />
<input type="submit" value="Поиск" id="searchsubmit" />
</div>
</form>
Я использую type=hidden
для получения пользовательского типа записи, по которому хочу выполнить поиск:
<input type="hidden" name="post_type" value="photo_group" />
что дает мне ссылку, похожую на:
http://mywebsite.com/?s=search&post_type=photo_group
Вопрос
Когда я использую новую форму поиска, созданную на странице, она использует стандартный search.php для отображения результатов. Как я могу отобразить результаты поиска пользовательского типа записей, скажем, в div
на той же странице?
Я пытался создать новый шаблон страницы, который бы отображал результаты, но безуспешно. Может быть, это правильный способ, и я просто сделал что-то неверно?
*Редактирование*
Я пытаюсь использовать решение sanchothefat. Правильно ли это выглядит? Это весь мой div для результатов поиска и поискового запроса.
<div id="photo-search">
<h2>Поиск фотографий:</h2>
<form action="<?php the_permalink(); ?>" id="searchform" method="get">
<div>
<label for="s" class="screen-reader-text">Искать:</label>
<input type="text" id="search" name="search" value="" />
<input type="hidden" name="post_type" value="photo_group" />
<input type="submit" value="Поиск" id="searchsubmit" />
</div>
</form>
<?php if( isset( $_REQUEST['search'] ) ) {
query_posts( array(
's' => $_REQUEST['search'],
'post_type' => $_REQUEST['photo_group'],
'paged' => $paged
));
if( have_posts() ) : while ( have_posts() ) :
the_title();
the_content();
endwhile; endif;
wp_reset_query();
}
?>
</div>
Я получаю ошибку 404 "страница не найдена" при выполнении поиска.

Самый простой вариант, если вы хотите отображать результаты поиска в контексте страницы - это создать пользовательский цикл, иначе вы не сможете получить доступ к информации страницы.
Измените поле ввода с именем s
на что-то другое, например search
или q
, чтобы WordPress не выполнял стандартный встроенный поиск.
Затем измените параметр action
формы на URL текущей страницы. Для этого можно использовать <?php get_permalink(); ?>
.
Необходимый цикл выглядит следующим образом:
<?php
if ( isset( $_REQUEST[ 'search' ] ) ) {
// выполнение поискового запроса
query_posts( array(
's' => $_REQUEST[ 'search' ],
'post_type' => $_REQUEST[ 'post_type' ],
'paged' => $paged
)
);
// цикл
if ( have_posts() ) : while ( have_posts() ) :
// перебор результатов здесь
endwhile; endif;
// возврат к исходному запросу
wp_reset_query();
}
?>

Мне нужно изменить if ( have_posts() ) : while ( have_posts() ) :
на if ( have_posts() ) : while ( have_posts() ) : the_post();
, чтобы избежать бесконечного цикла (не уверен, почему). Возможно, это потому что я рендерю кастомный шаблон внутри с помощью get_template_part(...)
.

Вы можете модифицировать запрос перед его обработкой:
add_action('parse_query', function($query){
// не поисковый запрос
if(!$query->is_search)
return;
// проверяем тип записи (вы должны предоставить белый список)
$post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : false;
// корректируем запрос
if($post_type && post_type_exists($post_type))
$query->set('post_type', $post_type);
});
Это позволит вам получать записи, соответствующие запрашиваемому типу.
Если вам нужно запросить несколько типов записей, просто передайте массив вместо строки: array('post', 'page', $post_type)
. А для группировки записей по типам проверяйте тип внутри цикла и сохраняйте ваши пользовательские типы записей во временный массив, который вы переберете после отображения обычных записей.
