Отображение результатов поиска на той же странице

24 апр. 2012 г., 01:10:23
Просмотры: 31.2K
Голосов: 8

Проблема

У меня есть страница на сайте, где мне нужно выполнить дополнительный поиск в пределах этой страницы. Я использую стандартный способ поиска 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 "страница не найдена" при выполнении поиска.

4
Комментарии

Сработало ли мое решение в итоге для вас?

sanchothefat sanchothefat
2 мая 2012 г. 17:43:45

Вы направили меня в правильном направлении, так что в каком-то смысле это помогло. Большое спасибо.

Romes Romes
2 мая 2012 г. 18:29:28

Какое у вас было решение? Я пытаюсь сделать то же самое — выводить результаты поиска пользовательского типа записи на той же странице, где выполняется поисковый запрос, но при нажатии кнопки отправки постоянно получаю страницу 404.

Claire Claire
7 нояб. 2012 г. 18:40:39

Я столкнулся с такой же проблемой и обнаружил, что наличие post_type=my_cpt_post_type в URL вызывало ошибку. Аналогично изменению имени поля ввода по умолчанию с 's' на 'search' в ответе ниже, я изменил скрытое поле с 'post_type' на 'p_type', и это решило проблему. Затем в вашем запросе можно использовать 'post_type' => $_REQUEST[ 'p_type' ]

philip philip
1 февр. 2021 г. 16:19:04
Все ответы на вопрос 2
1

Самый простой вариант, если вы хотите отображать результаты поиска в контексте страницы - это создать пользовательский цикл, иначе вы не сможете получить доступ к информации страницы.

Измените поле ввода с именем 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();
    }
?>
24 апр. 2012 г. 11:39:16
Комментарии

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

jmarceli jmarceli
26 окт. 2015 г. 14:23:43
2

Вы можете модифицировать запрос перед его обработкой:

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). А для группировки записей по типам проверяйте тип внутри цикла и сохраняйте ваши пользовательские типы записей во временный массив, который вы переберете после отображения обычных записей.

24 апр. 2012 г. 03:13:21
Комментарии

Это нужно добавить в файл functions.php или просто прямо на страницу?

Romes Romes
24 апр. 2012 г. 17:02:57

да, либо так, либо создайте новый плагин и вставьте туда этот код

onetrickpony onetrickpony
24 апр. 2012 г. 17:48:26