
Существует не мало плагинов для улучшения поиска в WordPress, среди них даже такие, которые изменяют алгоритм поиска. На мой взгляд, если изменять структуру поиска WordPress, то наверное, лучше воспользоваться готовыми решениями от Яндекса или Гугла, т.е. внедрить в сайт их поиск. Но эта статья совсем не об этом. Здесь я хочу совсем немного улучшить стандартный поиск WordPress - сделать подсветку искомых слов и ничего больше, кому нужно что-то большее дальше статью могут не читать.
Итак, задача, сделать подсветку результатов поиска, без использования плагинов, решается ниже-представленным способом, а точнее функцией, которая по сути аналогична, пожалуй, самому простому, плагину для подсветки результатов поиска в WordPress Search Hilite - подсвечиваются слова и больше никаких действий.
Для использования, поместите нижеследующий код (см. обновления) в файл шаблона functions.php.
/* Функция для подсветки слов поиска в WordPress */
function kama_search_lite($text, $echo=true) {
// ------------ Настройки -----------
$st1 = 'color: #000; background: #99ff66;';
$st2 = 'color: #000; background: #ffcc66;';
$st3 = 'color: #000; background: #99ccff;';
$st4 = 'color: #000; background: #ff9999;';
$st5 = 'color: #000; background: #FF7EFF;';
// ---------- Конец Настроек ---------
$query_terms = get_query_var('search_terms');
if ( empty($query_terms) ) $query_terms = array(get_query_var('s'));
if ( empty($query_terms) ) return;
foreach ($query_terms as $term) {
$n++;
if ($n==1) $style=$st1;
elseif($n==2) $style=$st2;
elseif($n==3) $style=$st3;
elseif($n==4) $style=$st4;
elseif($n==5) $style=$st5;
$term = preg_quote($term, '/');
$text = preg_replace("@(?<!<|</)($term)@iu", "<span style='{$style}'>$1</span>", $text);
}
if($echo) return print $text;
else return $text;
}
add_filter('the_content', 'kama_search_lite');
add_filter('the_excerpt', 'kama_search_lite');
add_filter('the_title', 'kama_search_lite');
Функция будет работать, если в файле search.php у вас для вывода результатов поиска используется функция the_excerpt() или the_content(), если вывод осуществляется нестандартно читайте ниже. В самом начале кода можно настроить цвета найденных слов и их фон - $st1 - первое слово, $st2 - второе и т.д.
По умолчанию цвета такие: Подсвечиваем результаты поиска, без плагинов.
Если для вывода поиска используются другие функции отличные от the_excerpt() или the_content(), то чтобы подсветка работала, нужно прогнать выводимый текст через эту функцию. Допустим, вы используете для вывода результатов поиска функцию get_my_excerpt(), тогда, чтобы подсветка работала вывод нужно будет записать подобным образом:
$SearchResultContent = get_my_excerpt(); kama_search_lite($SearchResultContent);
Обновление 21.04.2010
1. Были непонятные баги с подсветкой - не все слова / вхождения подсвечивались. Как выяснелось проблема была в регулярке я ее упростил (потому что, чем проще тем гениальнее
), теперь подсвечивается абсолютно все.
2. Теперь подсветка регистронезависима для кириллицы, т.е. если в поиске задано например, слово "поиск", то подсветятся слова: "Поиск", "поиск" или "ПОИСК". Эта проблема существует и в плагине Search Hilite. Давно хотел поправить этот баг - пришлось попотеть, пока понял где собака зарыта.
/* Функция для подсветки слов поиска в WordPress */
function kama_search_lite($text, $echo=true) {
// ------------ Настройки -----------
$st1 = 'color: #000; background: #99ff66;';
$st2 = 'color: #000; background: #ffcc66;';
$st3 = 'color: #000; background: #99ccff;';
$st4 = 'color: #000; background: #ff9999;';
$st5 = 'color: #000; background: #FF7EFF;';
// ---------- Конец Настроек ---------
$query_terms = get_query_var('search_terms');
if ( empty($query_terms) ) $query_terms = array(get_query_var('s'));
if ( empty($query_terms) ) return;
foreach ($query_terms as $term) {
$n++;
if ($n==1) $style=$st1;
elseif($n==2) $style=$st2;
elseif($n==3) $style=$st3;
elseif($n==4) $style=$st4;
elseif($n==5) $style=$st5;
$term = preg_quote($term, '/');
$term2 = kama_cry_ucfirst($term);
$term3 = kama_cry_strtoupper($term);
$text = preg_replace("@(?<!<|</)($term|$term2|$term3)@i","<span style='{$style}'>$1</span>",$text);
}
if($echo) return print $text;
else return $text;
}
function kama_cry_strtoupper ($str){
$upper_cry_table = array('а'=>'А','б'=>'Б','в'=>'В','г'=>'Г','д'=>'Д','е'=>'Е','ё'=>'Ё','ж'=>'Ж',
'з'=>'З','и'=>'И','к'=>'К','л'=>'Л','м'=>'М','н'=>'Н','о'=>'О','п'=>'П','р'=>'Р','с'=>'С',
'т'=>'Т','у'=>'У','ф'=>'Ф','х'=>'Х','ц'=>'Ц','ч'=>'Ч','ш'=>'Ш','щ'=>'Щ','э'=>'Э','ю'=>'Ю','я'=>'Я','ъ'=>'Ъ','ь'=>'Ь');
$str = strtr ($str,$upper_cry_table);
return $str;
}
function kama_cry_ucfirst($str){
$m1 = kama_cry_strtoupper( iconv_substr($str, 0, 1, 'UTF-8') );
$m = iconv_substr($str, 1, 1000000, 'UTF-8');
return $m1.$m;
}
add_filter('the_content', 'kama_search_lite');
add_filter('the_excerpt', 'kama_search_lite');
add_filter('the_title', 'kama_search_lite');
Обновление 29.04.2010
Спасибо Ю.Б. за подсказку (в комментариях) использовать модификатор u для регулярки - код значительно сократился.
/* Функция для подсветки слов поиска в WordPress */
function kama_search_lite($text, $echo=true) {
// ------------ Настройки -----------
$st1 = 'color: #000; background: #99ff66;';
$st2 = 'color: #000; background: #ffcc66;';
$st3 = 'color: #000; background: #99ccff;';
$st4 = 'color: #000; background: #ff9999;';
$st5 = 'color: #000; background: #FF7EFF;';
// ---------- Конец Настроек ---------
$query_terms = get_query_var('search_terms');
if ( empty($query_terms) ) $query_terms = array(get_query_var('s'));
if ( empty($query_terms) ) return;
foreach ($query_terms as $term) {
$n++;
if ($n==1) $style=$st1;
elseif($n==2) $style=$st2;
elseif($n==3) $style=$st3;
elseif($n==4) $style=$st4;
elseif($n==5) $style=$st5;
$term = preg_quote($term, '/');
$text = preg_replace("@(?<!<|</)($term)@iu","<span style='{$style}'>$1</span>",$text);
}
if($echo) return print $text;
else return $text;
}
add_filter('the_content', 'kama_search_lite');
add_filter('the_excerpt', 'kama_search_lite');
add_filter('the_title', 'kama_search_lite');
- Предыдущие по меткам
- Предыдущие записи
- Альтернатива плагину WP-pagenavi (пагинация для WordPress) ← 29.Мар.2010 // 67
- Обрезка текста и/или замена стандартной функции the_excerpt() ← 11 Апрель 2010 // 55
- Функция для вывода последних комментариев ← 11 Апрель 2010 // 88
- Меняем символы ХТМЛ (< >) на спецсимволы при комментировании ← 16 Апрель 2010 // 12
Позволю себе парочку замечаний. 1. "без плагинов" - формально да, но разницы между плагином и кодом в functions.php не так уж много. 2. Используйте модификатор 'u' у шаблонов preg_* функций - помогает от головоной боли с utf
Чтобы звучало
Можно конечно эту функцию в плагин запихать, но по-моему это лишнее.
Большое спасибо за наводку! Не знал про этот модификатор. Обновил пост.
Не хватает знаний что бы поправить код в 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; ?>Кода недостаточно, но видимо эта функция (нестандартная) выводит контент поиска
mystique_post();Нужно внутри неё смотреть, что к чему.На моем сайте плохо работает. Добавляет единички какие-то в результатах поиска. Когда просто смотришь главную страницу, то вообще выдает html-код!
аналогично, как исправить?
Подскажите пожалуйста, у меня в шапке сайта, поле поиска уже есть слово Search, но я никак не могу найти место, где можно заменить его на Поиск и сделать активным.Я в этом ничего не понимаю,если не затруднит,возможно расписать подробнее.Спасибо!
Ошибка вылетает на 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
Подправил возможную причину ошибки. Попробуйте новый код.
пробовал на денвере вроде все заработало, но стал ставить на сайт везде вылезли " 1 ", вот скрин http://floomby.ru/content/Ib2w3NioeU/full/
В конце ссылки почему-то прибавляется /r, если это удалить то отобразится скриншот сайта на котором видна ошибка после применения данной функции. Надеюсь на помощь автора!
Гавнокодеры ... ошибка в регулярке
Гавнокритик... мог бы и поправить. У меня обратные слэши пропали во всех статьях, поэтому ошибки встречаются в некоторых кодах.
Помогите найти плагин для этой цели.не хочу в кодах ковыраться и чтото сламать...