Comment mettre en évidence les termes de recherche sans plugin

15

Comment puis-je mettre les termes de recherche en surbrillance sans plugin?

tp
la source

Réponses:

14

Ajoutez ces 2 fonctions à vos fonctions.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;
}

Éditer:

Pour utiliser the_content pour vos résultats de recherche, utilisez la fonction ci-dessous:

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>';
    }

Dans votre boucle ou appel <?php search_title_highlight(); ?>au fichier search.php au lieu de <?php the_title(); ?>et utilisez <?php search_excerpt_highlight(); ?>au lieu de<?php the_excerpt(); ?>

Dans votre css, ajoutez la classe search-highlight qui mettra en surbrillance tous les mots recherchés en jaune.

.search-highlight {
    background:#FFFF00  
    }
Chris_O
la source
3
Appliquez preg_quote()à $keyspour éviter que votre expression régulière explose en cas de caractères spéciaux tels que des parenthèses ou des crochets.
Geert
1
Qu'en est-il de la mise en évidence du terme de recherche après que l'utilisateur a cliqué sur le single et est entré dans le message? Ensuite, get_search_query () renvoie une chaîne vide
Maor Barazany
1
Ceux-ci devraient être des filtres pour the_excerptet à la the_contentplace. Quoi qu'il en soit: une belle réponse, mais le commentaire de @Geert pourrait être travaillé dans :)
kaiser
1
Il applique le code <strong class = "search-highlight"> dans notre lien readmore également s'il a un terme de recherche, comment pouvons-nous résoudre cela.
1
il remplace également le texte dans le readmore href? Comment régler ceci?
Naveen
3

Ce qui précède fonctionne bien. J'ai exécuté le code similaire, mais liez le titre et l'extrait ensemble. Mais il a été détecté lorsque quelqu'un entre dans un espace "" au début ou à la fin d'un terme de requête de recherche.

J'ai donc ajouté cette ligne:

$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');

J'espère que cela s'avère utile pour les autres.

Kyzer
la source
2

Les solutions ci-dessus cassent la page si le terme de recherche apparaît à l'intérieur des balises HTML. Vous devez utiliser quelque chose comme:

      $regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu';
      $text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);
TAH
la source
1
merci camarade vous avez fait ma journée :-)
Agha Umair Ahmed