Статьи

Как добавить расширенный поиск на ваш сайт WordPress

Большинство форм поиска WordPress устанавливают один параметр строки запроса с именем ‘s’:

<form method="get" action="<?php bloginfo('url'); ?>"> <fieldset> <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" /> <button type="submit">Search</button> </fieldset> </form> 

В этом нет ничего плохого, и я думал, что это единственный вариант на многие годы.

Тем не менее, более сложные запросы возможны без помощи плагинов (хотя доступно множество ). В глубине ядра WordPress приложение анализирует несколько других параметров строки запроса и использует их для получения более сфокусированного набора результатов поиска. Существует некоторая элементарная документация, в которой перечислены имена параметров:

  • прикрепление
  • attachment_id
  • автор
  • имя автора
  • Кот
  • category_name
  • comments_popup
  • день
  • ошибка
  • подача
  • час
  • м
  • минут
  • monthnum
  • имя
  • п
  • page_id
  • выгружаемый
  • ИмяСтраницы
  • post_parent
  • post_type
  • предварительный просмотр
  • второй
  • статический
  • subpost
  • subpost_id
  • тег
  • tag_id
  • Т.Б.
  • вес
  • год

Я не уверен, что все эти работы ожидаются, а некоторые немного бессмысленны, но они соответствуют параметрам, которые вы можете передать WP_Query . Поэтому мы можем создать расширенную форму поиска, используя HTML с smidgen PHP для автоматизации опций.

Уточнить поиск по категории

Вы можете ограничить результаты категорией, передав ее слаг в параметр category_name , например

 http://yoursite.com/?s=search+term&category_name=kittens 

Наша форма поиска может позволить пользователю уточнить свой поиск по определенным категориям:

 <form method="get" action="<?php bloginfo('url'); ?>"> <fieldset> <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" /> <select name="category_name"> <option value="">all categories</option> <option value="kittens">cute kittens</option> <option value="puppies">adorable puppies</option> </select> <button type="submit">Search</button> </fieldset> </form> 

Если вы предпочитаете перечислить все категории, добавьте следующий код между тегами <select> и </select> :

 <?php // generate list of categories $categories = get_categories(); foreach ($categories as $category) { echo '<option value="', $category->slug, '">', $category->name, "</option>\n"; } ?> 

Уточнить поиск по тегу

Результаты поиска могут быть ограничены тегом, передав его параметр в tag , например

 http://yoursite.com/?s=search+term&tag=cockroach 

Поэтому ваш поиск из может ограничить результаты определенными тегами, например

 <form method="get" action="<?php bloginfo('url'); ?>"> <fieldset> <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" /> <select name="tag"> <option value="">any tag</option> <option value="cockroach">cockroaches</option> <option value="snake">snakes</option> </select> <button type="submit">Search</button> </fieldset> </form> 

Точно так же вы можете создать список всех тегов для поля select :

 <?php // generate list of tags $tags = get_tags(); foreach ($tags as $tag) { echo '<option value="', $tag->slug, '">', $tag->name, "</option>\n"; } ?> 

Продвижение расширенного поиска

Что если вы хотите уточнить поиск по нескольким значениям? Например, пользователь может выбрать два или более тега, и на полученных страницах они должны быть установлены. Мы не можем достичь этого, используя только параметры URL, но начнем с определения формы поиска HTML:

 <form method="get" action="<?php bloginfo('url'); ?>"> <fieldset> <input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" /> <p>Refine search to posts containing chosen tags:</p> <?php // generate list of tags $tags = get_tags(); foreach ($tags as $tag) { echo '<label>', '<input type="checkbox" name="taglist[]" value="', $tag->slug, '" /> ', $tag->name, "</label>\n"; } ?> <button type="submit">Search</button> </fieldset> </form> 

Обратите внимание, что я использовал параметр массива PHP с именем taglist . Вы можете использовать любое имя, кроме уже зарезервированного WordPress (см. Список выше).

Теперь мы можем перехватить запрос на поиск в файле functions.php нашей темы WordPress. Функция advanced_search_query определяет, активен ли поиск, а затем соответствующим образом tag_slug__and параметр tag_slug__and tag_slug__and .

 // advanced search functionality function advanced_search_query($query) { if($query->is_search()) { // tag search if (isset($_GET['taglist']) && is_array($_GET['taglist'])) { $query->set('tag_slug__and', $_GET['taglist']); } return $query; } } 

Наконец, мы используем pre_get_posts действия pre_get_posts для запуска нашей функции advanced_search_query перед выполнением запроса:

 add_action('pre_get_posts', 'advanced_search_query', 1000); 

Добавление расширенных средств поиска в WordPress удивительно просто, но немногие разработчики понимают, что это возможно … возможно, потому что документации и примеров немного . Я обнаружил это случайно, поэтому надеюсь, что этот код окажется полезным в вашем следующем проекте WordPress.