Як виділити пошукові терміни без плагіна


15

Як можна виділити пошукові терміни без плагіна?

Відповіді:


14

Додайте ці 2 функції до своїх функцій.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;
}

Редагувати:

Щоб скористатись_контентом для результатів пошуку, скористайтеся нижченаведеною функцією:

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

У циклі або search.php виклик файлу <?php search_title_highlight(); ?>замість <?php the_title(); ?>та використання <?php search_excerpt_highlight(); ?>замість<?php the_excerpt(); ?>

У свій css додайте клас виділення пошуку, який виділить усі пошукові слова жовтим кольором.

.search-highlight {
    background:#FFFF00  
    }

3
Застосуйте, preg_quote()щоб $keysзапобігти вибуху регексу у випадку використання спеціальних символів, таких як дужки або дужки.
Геерт

1
А що з виділенням пошукового терміну після того, як користувач натисне на сингл і зайде всередину публікації? Тоді get_search_query () повертає порожній рядок
Маор Баразани

1
Це повинні бути фільтри для the_excerptі the_contentзамість цього. У будь-якому випадку: приємна відповідь, але над коментарем від @Geert можна було попрацювати :)
kaiser

1
Він застосовує <strong class = "search -light"> код у нашому посиланні readmore, також якщо він має пошуковий термін, як ми можемо це вирішити.

1
це також заміна тексту в href для читання? як це виправити?
Naveen

3

Сказане вище добре працює, я запускаю аналогічний код, але зв’язую заголовок та уривок разом. Але виявлено, що це порушується, коли хтось потрапляє в пробіл "" на початку або в кінці пошукового запиту.

Тож я додаю цей рядок:

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

Сподіваюсь, це доводить допомогу іншим.


2

Вищезазначені рішення розбивають сторінку, якщо пошуковий термін з’являється всередині тегів HTML. Вам слід використовувати щось на кшталт:

      $regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu';
      $text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);

1
спасибі товариш, який ти зробив мій день :-)
Ага Умайр Ахмед
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.