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.
Geert
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 :)
kaiser
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
Maor Barazany
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.
User
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;
}