Come evidenziare i termini di ricerca senza plugin


15

Come posso evidenziare i termini di ricerca senza plugin?

Risposte:


14

Aggiungi queste 2 funzioni al tuo function.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;
}

Modificare:

Per usare the_content per i risultati della tua ricerca usa la seguente funzione:

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 di evidenziazione della ricerca che evidenzierà tutte le parole cercate in giallo.

.search-highlight {
    background:#FFFF00  
    }

3
Fai domanda preg_quote()per $keysevitare che la tua regex esploda in caso di caratteri speciali come parentesi o parentesi.
Geert,

1
Che ne dite di evidenziare il termine di ricerca dopo che l'utente ha fatto clic sul singolo e ha inserito il post? Quindi get_search_query () restituisce una stringa vuota
Maor Barazany,

1
Questi dovrebbero essere filtri per the_excerpte the_contentinvece. Comunque: bella risposta, ma il commento di @Geert potrebbe essere elaborato :)
kaiser

1
Applica il codice <strong class = "search-highlight"> nel nostro link readmore anche se ha un termine di ricerca, come possiamo risolverlo.

1
sta sostituendo anche il testo nel readmore href? come risolvere questo?
Naveen,

3

Quanto sopra funziona bene Ho eseguito il codice simile, ma lego il titolo e l'estratto insieme. Ma ho scoperto che si interrompe quando qualcuno inserisce uno spazio "" all'inizio o alla fine di un termine della query di ricerca.

Quindi ho aggiunto questa riga:

$keys = array_filter($keys);

// Add Bold to searched term
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', ''.$sr.'', $text);
     }
     return $text;
}
add_filter('the_excerpt', 'highlight_results');
add_filter('the_title', 'highlight_results');

Spero che questo dimostri di aiutare gli altri.


2

Le soluzioni precedenti 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);

1
grazie amico mi hai reso la mia giornata :-)
Agha Umair Ahmed il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.