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

15

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

ф
источник

Ответы:

14

Добавьте эти 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  
    }
Chris_O
источник
3
Применить, preg_quote()чтобы $keysпредотвратить регулярное выражение вашего регулярного выражения в случае специальных символов, таких как скобки или скобки.
Герт
1
Как насчет выделения поискового термина после того, как пользователь нажимает на сингл и заходит внутрь поста? Затем get_search_query () возвращает пустую строку
Maor Barazany
1
Это должны быть фильтры для the_excerptи the_contentвместо. В любом случае: Хороший ответ, но комментарий от @Geert можно было бы обработать :)
kaiser
1
Он применяет код <strong class = "search-highlight"> в нашей ссылке readmore также, если у него есть поисковый термин, как мы можем решить это.
1
это заменяет текст в readmore href также? как это исправить?
Навин
3

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

Итак, я добавлю эту строку:

$keys = array_filter($keys);

// Add Bold to searched term
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', ''.$sr.'', $text);
     }
     return $text;
}
add_filter('the_excerpt', 'highlight_results');
add_filter('the_title', 'highlight_results');

Надеюсь, это поможет другим.

Kyzer
источник
2

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

      $regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu';
      $text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);
TAH
источник
1
Спасибо, приятель, ты сделал мой день :-)
Ага Умайр Ахмед