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

Добавьте эти 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
}

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

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

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

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

Вышеприведённый код работает хорошо, я запускал похожий код, но связывал заголовок и краткое описание вместе. Однако обнаружил, что он ломается, когда кто-то вводит пробел " " либо в начале, либо в конце поискового запроса.
Поэтому я добавил эту строку:
$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');
Надеюсь, это окажется полезным для других.

Приведенные выше решения нарушают отображение страницы, если поисковый запрос встречается внутри HTML-тегов. Вместо этого следует использовать что-то вроде:
$regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu';
$text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);

Объединение 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;
}
