WordPress. Поиск по сайту

09.05.2019

Теги: CMSWeb-разработкаWordPressЗапросПоискФорма

За поиск по сайту в WordPress отвечает класс WP_Query, который имеет большое количество параметров. Многие из этих параметров могут быть определены в поисковой форме (или непосредственно в URL), что изменит результаты поиска. Например, чтобы превратить обычный поиск в поиск по произвольному типу записей product, достаточно ввести следующее:

http://www.server.com/?s=samsung&post_type=product

В итоге мы получим результаты для записей с типом product, которые содержат в своем заголовке или контенте слово «samsung».

Если посмотреть список параметров WP_Query, то можно обнаружить много строковых и целочисленных параметров, которые можно передать в URL, чтобы изменить поведение поиска — начиная от добавления или исключения категорий и заканчивая добавлением поиска по таксономии и ограничением поиска по определенным авторам.

Поиск по фразе

По умолчанию WordPress совершает поиск по отдельным словам. Это означает, что если в поиск передан запрос из двух слов — «phone samsung», то WordPress сформирует следующий код для условия WHERE:

WHERE
    (
        (`wp_posts`.`post_title` LIKE '%phone%') OR
        (`wp_posts`.`post_content` LIKE '%phone%')
    )
    AND
    (
        (`wp_posts`.`post_title` LIKE '%samsung%') OR
        (`wp_posts`.`post_content` LIKE '%samsung%')
    )

Как видите, идет поиск не целой фразы, а поиск отдельных слов — «phone» в заголовке или контенте и «samsung» в заголовке или контенте. Таким образом, запись, содержащая слово «phone» в заголовке и «samsung» в контенте будет показана в результатах поиска. Хотя вряд ли пользователь хотел именно это.

Но, можно сделать так, чтобы WordPress искал фразу целиком — для этого достаточно добавить sentence=1 в URL, что приведет к изменению условия WHERE:

WHERE
    (
        (`wp_posts`.`post_title` LIKE '%phone samsung%') OR
        (`wp_posts`.`post_content` LIKE '%phone samsung%')
    )

Теперь поиск ведется по фразе, поэтому заголовок или контент записи должен содержать оба слова (не обязательно подряд), чтобы попасть в результаты поиска.

Поиск точного совпадения

Связанным с sentence, однако более специфичным является параметр exact. Добавление exact=1 к URL приведет к следующим изменениям в условии WHERE:

WHERE
    (
        (`wp_posts`.`post_title` LIKE 'phone samsung') OR
        (`wp_posts`.`post_content` LIKE 'phone samsung')
    )

Теперь заголовок или контент должен точно соответствовать поисковому запросу, а не просто включать его в себя. Если ни один товар не имеет в заголовке фразы «phone samsung», то никаких результатов выдано не будет.

Фома поиска

Функция get_search_form() подключает форму поиска, используя файл темы searchform.php. Если такого файла в шаблоне темы нет, то будет использован дефолтный html-код для формы поиска:

<form role="search" method="get" id="searchform" class="searchform" action="http://www.server.com/">
    <div>
        <label class="screen-reader-text" for="s">Найти:</label>
        <input type="text" value="" name="s" id="s" />
        <input type="submit" id="searchsubmit" value="Поиск" />
    </div>
</form>

Если включена поддержка html5, то по умолчанию html-код формы будет немного другим — тип поля меняется с text на search.

add_theme_support('html5', array('search-form'));

Функция имеет необязательный параметр $echo, который позволяет получить html-код формы для дальнейшей обработки, вместо того, чтобы выводить на экран.

Пример файла темы searchform.php с формой поиска:

<form role="search" method="get" id="searchform" action="<?= home_url('/'); ?>">
    <input type="text" value="<?= get_search_query(); ?>" name="s" id="s" />
    <input type="hidden" name="sentence" value="1" />
    <input type="hidden" name="post_type" value="product" />
    <input type="submit" id="searchsubmit" value="Искать" />
</form>

Можно не создавать файл searchform.php, а изменить html-код формы через хук get_search_form:

add_filter(
    'get_search_form',
    function($form) {
        $action = home_url('/');
        $query = get_search_query();
        $form =
<<<FORM
<form role="search" method="get" id="searchform" action="$action" >
    <input type="text" value="$query" name="s" id="s" />
    <input type="hidden" name="sentence" value="1" />
    <input type="hidden" name="post_type" value="product" />
    <input type="submit" id="searchsubmit" value="Искать" />
</form>
FORM;
        return $form;
    }
);

Поиск: CMS • Web-разработка • WordPress • Поиск • Search • Form • Форма • Запрос • SQL • get_search_form • get_search_query

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.