Come evidenziare i termini di ricerca senza plugin
Come posso evidenziare i termini di ricerca senza utilizzare un plugin?

Aggiungi queste 2 funzioni al tuo 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;
}
Modifica:
Per utilizzare the_content nei tuoi risultati di ricerca usa la funzione qui sotto:
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>';
}
Nel tuo loop o nel file search.php chiama <?php search_title_highlight(); ?>
invece di <?php the_title(); ?>
e usa <?php search_excerpt_highlight(); ?>
invece di <?php the_excerpt(); ?>
Nel tuo css aggiungi la classe search-highlight che evidenzierà in giallo tutte le parole cercate.
.search-highlight {
background:#FFFF00
}

Applica preg_quote()
a $keys
per evitare che la tua regex fallisca in caso di caratteri speciali come parentesi o parentesi quadre.

Questi dovrebbero essere filtri per the_excerpt
e the_content
invece. Comunque: Bella risposta, ma il commento di @Geert potrebbe essere integrato :)

E se evidenziassimo il termine di ricerca dopo che l'utente clicca sul singolo post e vi accede? In quel caso get_search_query() restituisce una stringa vuota

Applica <strong class="search-highlight"> codice anche nel nostro link readmore se contiene il termine di ricerca, Come possiamo risolvere questo problema.

Il codice sopra funziona bene, ho eseguito un codice simile, ma ho collegato il titolo e l'estratto insieme. Tuttavia, ho scoperto che si interrompe quando qualcuno inserisce uno spazio " " all'inizio o alla fine di un termine di ricerca.
Quindi ho aggiunto questa riga:
$keys = array_filter($keys);
// Aggiunge grassetto al termine cercato
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');
Spero che questo possa essere utile ad altri.

Le soluzioni sopra riportate interrompono la pagina se il termine di ricerca appare all'interno dei tag HTML. Dovresti usare qualcosa come:
$regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu';
$text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);

Combinati 2 risposte per utilizzare i filtri:
// Aggiungi classe ai termini cercati
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');
Poi nel tuo CSS (per esempio):
.search-highlight {
background: #ffff94;
padding: 0 2px;
}
