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; } );
- WordPress. Фильтр записей по произвольным полям. Часть 2 из 3
- WordPress. Фильтр записей по произвольным полям. Часть 3 из 3
- WordPress. Постоянные ссылки и преобразование URL
- WordPress. Порядок загрузки страницы
- WordPress. Обработка POST-запросов. Часть 1
- WordPress. Загрузка файлов. Часть 3 из 3
- WordPress. Загрузка файлов. Часть 2 из 3
Поиск: CMS • Web-разработка • WordPress • Поиск • Search • Form • Форма • Запрос • SQL • get_search_form • get_search_query