Расширенный поиск для WordPress

В течении многих лет по умолчанию для формы поиска был установлен единый параметр querystring с названием "s". В этом нет ничего плохого. Но в ядре WordPress при поиске, приложение анализирует и ряд других параметров, это даёт нам возможность показать более целенаправленный набор результатов поиска без помощи плагинов.

Расширенный поиск

Мы можем создать форму расширенного поиска с помощью HTML и немного PHP что бы автоматизировать функции.

к меню ↑

Поиск в определённой рубрике

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

http://yoursite.ru/?s=dialog&category_name=html5

Форма ниже, даёт возможность пользователю уточнить свой выбор поиска из конкретной рубрики:

<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="">все рубрики</option>
<option value="html5">html5</option>
<option value="css3">css3</option>
</select>
<button type="submit">Поиск</button>
</fieldset>
</form>

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

<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">
<?php
// генератор списка рубрик
$categories = get_categories();
foreach ($categories as $category) {
    echo '<option value="', $category->slug, '">', $category->name, "</option>\n";
}
?>
</select>
<button type="submit">Поиск</button>
</fieldset>
</form>
к меню ↑

Поиск в определённой метке

Передавая параметр tag можно ограничить результаты поиска определённой меткой, например:

http://yoursite.com/?s=shadow&tag=css3

Форма ниже даёт возможность пользователю уточнить свой выбор поиска из конкретной метки:

<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="">все метки</option>
<option value="css3">css3</option>
<option value="design">дизайн</option>
</select>
<button type="submit">Поиск</button>
</fieldset>
</form>

Так же есть возможность показать пользователю список всех меток сайта:

<form method="get" action="<?php bloginfo('url'); ?>">
<fieldset>
<input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
<select name="tag">
<?php
// генератор списка меток
$tags = get_tags();
foreach ($tags as $tag) {
    echo '<option value="', $tag->slug, '">', $tag->name, "</option>\n";
}
?>
</select>
<button type="submit">Поиск</button>
</fieldset>
</form>
к меню ↑

Подключить расширенный поиск

Предположим нужно настроить поиск с несколькими значениями. Например, пользователь может выбрать для поиска две или более метки, а результат  должен отобразить на странице весь набор. Мы не можем получить такой результат используя параметры по одному URL.

Сначала для поиска определим форму HTML:

<form method="get" action="<?php bloginfo('url'); ?>">
<fieldset>
<input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
<p>Уточните пожалуйста метки для поиска:</p>
<?php
// генератор списка меток
$tags = get_tags();
foreach ($tags as $tag) {
    echo
        '<label>',
        '<input type="checkbox" name="taglist[]" value="',  $tag->slug, '" /> ',
        $tag->name,
        "</label>\n";
}
?>
<button type="submit">Поиск</button>
</fieldset>
</form>

В коде используется массив PHP с именем taglist. Вы можете использовать любое имя кроме зарезервированных в WordPress.

Что бы добавить расширенный поиск в WordPress, открываем файл functions.php активной темы и вставляем функцию:

// расширенные возможности поиска
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;
    }
}

Функция advanced_search_query проверяет является ли поиск активным и устанавливает для WP_Query параметр tag_slug__and

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

add_action('pre_get_posts', 'advanced_search_query', 1000);
к меню ↑

Заключение

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

htmlhook.ru | Скрипты для веб-приложений