WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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

Задача: сделать подсветку результатов поиска, без использования плагинов. Решается ниже представленным способом, а точнее функцией, которая по сути аналогична, пожалуй, самому простому плагину для подсветки результатов поиска в WordPress — Search Hilite  (подсвечиваются слова и больше никаких действий).

Поместите код в файл шаблона functions.php.

add_filter( 'the_content', 'kama_search_backlight' );
add_filter( 'the_excerpt', 'kama_search_backlight' );
add_filter( 'the_title', 'kama_search_backlight' );

# Функция для подсветки слов поиска в WordPress
function kama_search_backlight( $text ){

	// Настройки -----------
	$styles = ['',
		'color: #000; background: #99ff66;',
		'color: #000; background: #ffcc66;',
		'color: #000; background: #99ccff;',
		'color: #000; background: #ff9999;',
		'color: #000; background: #FF7EFF;',
	];

	// только для страниц поиска...
	if ( ! is_search() )
		return $text;

	$query_terms = get_query_var('search_terms');

	if( empty($query_terms) )
		$query_terms = array_filter( [ get_query_var('s') ] );

	if( empty($query_terms) )
		return $text;

	$n = 0;
	foreach( $query_terms as $term ){
		$n++;

		$term = preg_quote( $term, '/' );
		$text = preg_replace_callback( "/$term/iu", 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_backlight' );

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

Подсветка чего угодно

Если для вывода поиска используются функции отличные от the_excerpt() или the_content(), то чтобы подсветка работала, нужно «прогнать» выводимый текст через эту функцию.

Допустим, вы используете для вывода результатов поиска функцию get_my_excerpt(), тогда, чтобы подсветка работала вывод нужно будет записать подобным образом:

$search_result = get_my_excerpt();
echo kama_search_backlight($search_result);

Обновления

29.04.2010
Спасибо Ю.Б. за подсказку (в комментариях) использовать модификатор u для регулярного выражения - код значительно сократился.

21.04.2010

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

  2. Теперь подсветка регистронезависима для кириллицы, т.е. если в поиске задано например, слово "поиск", то подставятся слова: "Поиск", "поиск" или "ПОИСК". Эта проблема существует и в плагине Search Hilite. Давно хотел поправить этот баг - пришлось попотеть, пока понял где собака зарыта.
27 комментов
  • Ю.Б. blog.portal.kharkov.ua

    Позволю себе парочку замечаний. 1. "без плагинов" - формально да, но разницы между плагином и кодом в functions.php не так уж много. 2. Используйте модификатор 'u' у шаблонов preg_* функций - помогает от головоной боли с utf wink

    Ответить29.Апр.2010 00:10 #
    • Kama7752

      “без плагинов” – формально да, но разницы между плагином и кодом в functions.php не так уж много.

      Чтобы звучало smile Можно конечно эту функцию в плагин запихать, но по-моему это лишнее.

      Используйте модификатор ‘u’ у шаблонов preg_* функций – помогает от головоной боли с utf

      Большое спасибо за наводку! Не знал про этот модификатор. Обновил пост.

      Ответить29.Апр.2010 03:43 #
  • Ginom ginom.homedns.org

    Не хватает знаний что бы поправить код в search.php может поможете?
    Часть кода отвечающая за вывод:

    <?php do_action('mystique_before_primary'); ?>
    	  <?php
    	   $searchquery = wp_specialchars(get_search_query(),1);
    	   if(($searchquery) && ($searchquery!=__('Search',"mystique"))):
    		 if (have_posts()): ?>
    		 <h1 class="title"><?php printf(__("Search results for %s","mystique"),'<span class="altText">'.$searchquery.'</span>'); ?></h1>
    		 <?php
    		  mystique_pagenavi();
    
    		  while (have_posts()):
    		   the_post();
    		   mystique_post();
    		  endwhile; ?>
    Ответить25.Авг.2010 12:54 #
    • Kama7752

      Кода недостаточно, но видимо эта функция (нестандартная) выводит контент поиска mystique_post(); Нужно внутри неё смотреть, что к чему.

      Ответить25.Авг.2010 19:06 #
    • @ Вячеслав

      Похожая ситуация, покупная тема, везде функции с префиксами разработчика:
      Вот содержимое всего searh.php

      <?php get_header(); ?>
      <div class="mh-wrapper clearfix">
      	<div class="mh-main clearfix">
      		<div id="main-content" class="mh-loop mh-content" role="main"><?php
      			mh_before_page_content();
      			if (have_posts()) { ?>
      				<header class="page-header">
      					<h1 class="page-title">
      						<?php printf(esc_html__('Search Results for %s', 'mh-magazine'), '<span>«' . get_search_query() . '»</span>'); ?>
      					</h1>
      				</header><?php
      				mh_magazine_loop_layout();
      				mh_magazine_pagination();
      			} else {
      				get_template_part('content', 'none');
      			} ?>
      		</div>
      		<?php get_sidebar(); ?>
      	</div>
      	<?php mh_magazine_second_sidebar(); ?>
      </div>
      <?php get_footer(); ?>

      Хотя может этот плагин поставить _https://ru.wordpress.org/plugins/highlight-search-terms/ и не париться?

      Ответить25.Мар.2019 19:57 #
      • Kama7752

        Да попробуй установить плагин, если все сядет хорошо, то и париться не надо! yes

        Ответить26.Мар.2019 15:27 #
  • virtual see.od.ua

    На моем сайте плохо работает. Добавляет единички какие-то в результатах поиска. Когда просто смотришь главную страницу, то вообще выдает html-код!

    Ответить16.Мар.2011 01:45 #
  • Сергей www.pervayshagkmilionu.ru

    Подскажите пожалуйста, у меня в шапке сайта, поле поиска уже есть слово Search, но я никак не могу найти место, где можно заменить его на Поиск и сделать активным.Я в этом ничего не понимаю,если не затруднит,возможно расписать подробнее.Спасибо!

    Ответить16.Апр.2011 10:13 #
  • Антон oziblog.ru

    Ошибка вылетает на WP 3.2.1:
    Warning: preg_replace() [function.preg-replace]: Unknown modifier ')' in /home/АДРЕС/wp-content/themes/Flowers_from_1245-ru/functions.php on line 229

    Что посоветуете?

    Ответить20.Ноя.2011 00:13 #
  • Антон oziblog.ru

    Пробовал на трёх разных сайтах с разными темами - одинаковая ошибка. Может быть вставлять нужно как-то по особенному? Куда именно нужно вставлять, в какое место в коде?

    Или может быть можете посоветовать какой-нибудь плагин, который нормально с русским языком дружит?
    Пожалуйста.

    Ответить23.Ноя.2011 01:12 #
  • Garri studio-gost.ru
    Ошибка вылетает на WP 3.2.1: Warning: preg_replace() [function.preg-replace]: Unknown modifier ')' in /home/АДРЕС/wp-content/themes/Flowers_from_1245-ru/functions.php on line 229 Что посоветуете?
    аналогичная ошибка тока на worpress 3.3
    Ответить18.Дек.2011 23:07 #
    • Kama7752

      Подправил возможную причину ошибки. Попробуйте новый код.

      Ответить19.Дек.2011 10:41 #
      • Garri studio-gost.ru

        пробовал на денвере вроде все заработало, но стал ставить на сайт везде вылезли " 1 ", вот скрин http://floomby.ru/content/Ib2w3NioeU/full/

        Ответить21.Дек.2011 23:46 #
        • garri studio-gost.ru

          В конце ссылки почему-то прибавляется /r, если это удалить то отобразится скриншот сайта на котором видна ошибка после применения данной функции. Надеюсь на помощь автора!

          Ответить29.Янв.2012 13:00 #
  • Димон

    Гавнокодеры ... ошибка в регулярке

    1
    Ответить19.Дек.2011 22:27 #
    • Kama7752

      Гавнокритик... мог бы и поправить. У меня обратные слэши пропали во всех статьях, поэтому ошибки встречаются в некоторых кодах.

      1
      Ответить20.Дек.2011 00:46 #
  • vassil

    Помогите найти плагин для этой цели.не хочу в кодах ковыраться и чтото сламать...

    Ответить20.Дек.2011 22:13 #