WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Подсветка результатов поиска, без использования плагинов

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

Ищем WP-разработчика! Фулл-тайм, удаленка, хорошая зарплата, соц. пакет. Подробности.
Компания Boosta.

Задача: сделать подсветку результатов поиска, без использования плагинов. Решается ниже представленным способом, а точнее функцией, которая по сути аналогична, пожалуй, самому простому плагину для подсветки результатов поиска в 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

  1. Были непонятные баги с подсветкой - не все слова подсвечивались. Как выяснилось проблема была в регулярном выражении я ее упростил, теперь подсвечивается все.

  2. Теперь подсветка регистронезависима для кириллицы, т.е. если в поиске задано например, слово "поиск", то подставятся слова: "Поиск", "поиск" или "ПОИСК". Эта проблема существует и в плагине Search Hilite. Давно хотел поправить этот баг - пришлось попотеть, пока понял где собака зарыта.
31 коммент
Полезные 1 Вопросы 1 Все
    Войти