Cum să evidențiezi termenii de căutare fără plugin
Cum pot evidenția termenii de căutare fără a folosi un plugin?

Adaugă aceste 2 funcții în fișierul 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;
}
Editare:
Pentru a utiliza the_content în rezultatele căutării, folosește funcția de mai jos:
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>';
}
În bucla sau fișierul search.php apelează <?php search_title_highlight(); ?>
în loc de <?php the_title(); ?>
și folosește <?php search_excerpt_highlight(); ?>
în loc de <?php the_excerpt(); ?>
În CSS adaugă clasa search-highlight care va evidenția cu galben toate cuvintele căutate.
.search-highlight {
background:#FFFF00
}

Aplică preg_quote()
la $keys
pentru a preveni ca expresia ta regulată să eșueze în cazul caracterelor speciale precum paranteze sau paranteze drepte.

Acestea ar trebui să fie filtre pentru the_excerpt
și the_content
în loc. Oricum: Răspuns frumos, dar comentariul lui @Geert ar putea fi integrat :)

Cum rămâne cu evidențierea termenului de căutare după ce utilizatorul dă click pe un rezultat și intră în postare? Atunci get_search_query() returnează un șir gol

Se aplică <strong class="search-highlight"> cod în linkul nostru "readmore" chiar dacă acesta conține termenul de căutare, Cum putem rezolva acest lucru.

Funcționalitatea de mai sus funcționează bine, am rulat un cod similar, dar am legat titlul și rezumatul împreună. Totuși, am observat că se întrerupe când cineva introduce un spațiu " " fie la începutul, fie la sfârșitul unui termen de căutare.
Așadar, am adăugat această linie:
$keys = array_filter($keys);
// Adaugă Bold la termenii căutați
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');
Sper că acest lucru va fi de ajutor pentru alți dezvoltatori.

Solutiile de mai sus pot strica pagina dacă termenul de căutare apare în interiorul tag-urilor HTML. Ar trebui să utilizați ceva de genul:
$regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu';
$text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);

Combină 2 răspunsuri pentru a utiliza filtre:
// Adaugă clasă termenilor căutați
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');
Apoi în CSS-ul tău (de exemplu):
.search-highlight {
background: #ffff94;
padding: 0 2px;
}
