Как выделить поисковые термины без плагина

1 мая 2011 г., 05:18:37
Просмотры: 21.5K
Голосов: 19

Как можно выделить поисковые термины без использования плагина?

0
Все ответы на вопрос 4
5
17

Добавьте эти 2 функции в ваш файл functions.php

function search_excerpt_highlight() {
    $excerpt = get_the_excerpt();
    $keys = implode('|', explode(' ', get_search_query()));
    $excerpt = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $excerpt);

    echo '<p>' . $excerpt . '</p>';
}

function search_title_highlight() {
    $title = get_the_title();
    $keys = implode('|', explode(' ', get_search_query()));
    $title = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $title);

    echo $title;
}

Редактирование:

Для использования the_content в результатах поиска используйте следующую функцию:

function search_content_highlight() {
        $content = get_the_content();
        $keys = implode('|', explode(' ', get_search_query()));
        $content = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $content);

        echo '<p>' . $content . '</p>';
    }

В вашем цикле или файле search.php вызывайте <?php search_title_highlight(); ?> вместо <?php the_title(); ?> и используйте <?php search_excerpt_highlight(); ?> вместо <?php the_excerpt(); ?>

В ваш CSS добавьте класс search-highlight, который выделит все искомые слова жёлтым цветом.

.search-highlight {
    background:#FFFF00  
    }
1 мая 2011 г. 05:38:55
Комментарии

Примените preg_quote() к $keys, чтобы предотвратить сбой вашего регулярного выражения в случае специальных символов, таких как скобки или квадратные скобки.

Geert Geert
1 мая 2011 г. 10:09:24

Это должны быть фильтры для the_excerpt и the_content вместо этого. В любом случае: хороший ответ, но комментарий от @Geert можно было бы включить :)

kaiser kaiser
13 окт. 2012 г. 03:25:17

Что насчёт подсветки поискового запроса после того, как пользователь перейдёт на отдельную страницу поста? Тогда get_search_query() вернёт пустую строку

Maor Barazany Maor Barazany
23 мая 2011 г. 02:47:53

Он применяет <strong class="search-highlight"> к коду в нашей ссылке "readmore", даже если там есть поисковый запрос. Как это можно исправить?

User User
18 окт. 2012 г. 10:20:57

Он заменяет текст в href ссылки "readmore"? Как это исправить?

Naveen Naveen
13 янв. 2014 г. 14:58:21
0

Вышеприведённый код работает хорошо, я запускал похожий код, но связывал заголовок и краткое описание вместе. Однако обнаружил, что он ломается, когда кто-то вводит пробел " " либо в начале, либо в конце поискового запроса.

Поэтому я добавил эту строку:

$keys = array_filter($keys);

// Выделение жирным искомого термина
function highlight_results($text){
     if(is_search() && !is_admin()){
     $sr = get_query_var('s');
     $keys = explode(" ",$sr);
     <strong>$keys = array_filter($keys);</strong> // Удаление пустых значений из массива
     $text = preg_replace('/('.implode('|', $keys) .')/iu', ''.$sr.'', $text);
     }
     return $text;
}
add_filter('the_excerpt', 'highlight_results');
add_filter('the_title', 'highlight_results');

Надеюсь, это окажется полезным для других.

9 дек. 2014 г. 04:20:22
1

Приведенные выше решения нарушают отображение страницы, если поисковый запрос встречается внутри HTML-тегов. Вместо этого следует использовать что-то вроде:

      $regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu';
      $text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);
27 июл. 2015 г. 18:47:00
Комментарии

спасибо, приятель, ты сделал мой день :-)

Agha Umair Ahmed Agha Umair Ahmed
26 янв. 2016 г. 13:56:39
0

Объединение 2 ответов с использованием фильтров:

// Добавляем класс к искомым терминам
function highlight_results($text) {
    if (is_search() && !is_admin()) {
        $sr = get_query_var('s');
        $keys = explode(' ', $sr);
        $keys = array_filter($keys);
        $text = preg_replace('/('.implode('|', $keys) .')/iu', '<span class="search-highlight">\0</span>', $text);
    }
    return $text;
}
add_filter('the_excerpt', 'highlight_results');
add_filter('the_title', 'highlight_results');

Затем в вашем CSS (например):

.search-highlight {
    background: #ffff94;
    padding: 0 2px;
}
2 мар. 2020 г. 12:35:24