Come evidenziare i termini di ricerca senza plugin

1 mag 2011, 05:18:37
Visualizzazioni: 21.5K
Voti: 19

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

0
Tutte le risposte alla domanda 4
5
17

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  
    }
1 mag 2011 05:38:55
Commenti

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

Geert Geert
1 mag 2011 10:09:24

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

kaiser kaiser
13 ott 2012 03:25:17

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

Maor Barazany Maor Barazany
23 mag 2011 02:47:53

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

User User
18 ott 2012 10:20:57

sta sostituendo il testo nell'href del readmore? come risolvere?

Naveen Naveen
13 gen 2014 14:58:21
0

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.

9 dic 2014 04:20:22
1

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);
27 lug 2015 18:47:00
Commenti

grazie amico, mi hai migliorato la giornata :-)

Agha Umair Ahmed Agha Umair Ahmed
26 gen 2016 13:56:39
0

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;
}
2 mar 2020 12:35:24