Большинство форм поиска WordPress устанавливают один параметр строки запроса с именем ‘s’:
<form method="get" action="<?php bloginfo('url'); ?>"> <fieldset> <input type="text" name="s" value="" placeholder="search…" 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…" 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…" 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…" 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.