如何在没有插件的情况下突出显示搜索词


15

没有插件如何获取突出显示的搜索字词?

Answers:


14

将这两个函数添加到您的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;
}

编辑:

要将the_content用于搜索结果,请使用以下功能:

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类,该类将以黄色突出显示所有搜索到的单词。

.search-highlight {
    background:#FFFF00  
    }

3
适用preg_quote()$keys以防止你的正则表达式在特殊字符,如括号或支架的情况下炸毁。
盖尔特

1
在用户单击单曲并进入帖子后,突出显示搜索词该怎么办?然后get_search_query()返回一个空字符串
Maor Barazany

1
这些应该是the_excerpt和的过滤器the_content。无论如何:好的答案,但是@Geert的评论可以在:)中使用
kaiser

1
如果有搜索词,它将在我们的readmore链接中应用<strong class =“ search-highlight”>代码。

1
是否也要替换readmore href中的文本?如何解决这个问题?
Naveen 2014年

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
thanxs伴侣,您赢得了我的一天:-)
Agha Umair Ahmed
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.