Подсветка результатов поиска, без использования плагинов
Существует не мало плагинов для улучшения поиска в WordPress. Есть такие, которые изменяют алгоритм поиска, а есть которые делают поиск удобнее. В этой заметке речь пойдет именно о таком плагине. Я хочу совсем немного улучшить стандартный поиск WordPress: сделать подсветку искомых слов.

Задача: сделать подсветку результатов поиска, без использования плагинов. Решается ниже представленным способом, а точнее функцией, которая по сути аналогична, пожалуй, самому простому плагину для подсветки результатов поиска в WordPress — Search Hilite (подсвечиваются слова и больше никаких действий).
Поместите код в файл шаблона functions.php.
add_filter( 'the_content', 'kama_search_highlight' ); add_filter( 'get_the_excerpt', 'kama_search_highlight' ); add_filter( 'the_title', 'kama_search_highlight' ); /** * Highlight search words in specified text. * * @param string $text The text you want to highlight the words in. * * @return string * * @version 0.1 */ function kama_search_highlight( $text ){ // settings $styles = ['', 'color: #000; background: #99ff66;', 'color: #000; background: #ffcc66;', 'color: #000; background: #99ccff;', 'color: #000; background: #ff9999;', 'color: #000; background: #FF7EFF;', ]; // for the search pages and the main loop only. if( ! is_search() || ! in_the_loop() ) return $text; $query_terms = get_query_var( 'search_terms' ); if( empty( $query_terms ) ) $query_terms = array_filter( (array) get_search_query() ); if( empty( $query_terms ) ) return $text; $n = 0; foreach( $query_terms as $term ){ $n++; $term = preg_quote( $term, '/' ); $text = preg_replace_callback( "/$term/iu", static function( $match ) use ( $styles, $n ){ return '<span style="'. $styles[ $n ] .'">'. $match[0] .'</span>'; }, $text ); } return $text; }
Функция будет работать, если в файле search.php у вас для вывода результатов поиска используется функция the_excerpt() или the_content(). Если вывод осуществляется нестандартно, читайте ниже.
В самом начале кода можно настроить стили найденных слов: $st1 - первое слово, $st2 - второе и т.д.
По умолчанию цвета такие: Подсвечиваем результаты поиска, без плагинов.
Код лучше добавлять в сам файл поиска, непосредственно перед контентом, потому что если его добавить в functions.php, то из-за хука:
add_filter( 'the_title', 'kama_search_highlight' );
Также будут подсвечиваться слова в меню сайта, которое выводится через wp_nav_menu().
Подсветка чего угодно
Если для вывода поиска используются функции отличные от the_excerpt() или the_content(), то чтобы подсветка работала, нужно «прогнать» выводимый текст через эту функцию.
Допустим, вы используете для вывода результатов поиска функцию get_my_excerpt(), тогда, чтобы подсветка работала вывод нужно будет записать подобным образом:
$search_result = get_my_excerpt(); echo kama_search_highlight( $search_result );
Обновления
29.04.2010
Спасибо Ю.Б. за подсказку (в комментариях) использовать модификатор u для регулярного выражения - код значительно сократился.
21.04.2010
-
Были непонятные баги с подсветкой - не все слова подсвечивались. Как выяснилось проблема была в регулярном выражении я ее упростил, теперь подсвечивается все.
- Теперь подсветка регистронезависима для кириллицы, т.е. если в поиске задано например, слово "поиск", то подставятся слова: "Поиск", "поиск" или "ПОИСК". Эта проблема существует и в плагине Search Hilite. Давно хотел поправить этот баг - пришлось попотеть, пока понял где собака зарыта.