wordpress站内搜索高亮显示关键字

Posted in: Wordpress

现自己搜自己的东西的时候有时都很难找出来,也可以说是目的, 让用户搜索的结果更加一目了然.不知道为什么响当当的wordpress在这个功能上还这么的吝啬当然首先想到的就是谷歌的自定议搜索,这个很给力,能高亮关键字,但是无奈对着几乎所有的教程在我的小站上加一个cse都显得哪么的困难,可能是我的主题的关系总是走位,难看至极.后来看到万戈的站内搜索高亮关键字的文章去试了一下,这下高亮是能高亮了,但在我的主题,下会搜出若干一模一模的重复日志,直到我看到了philna的方法,才能算是基本小有效果,暂且就这样吧,日后还是用国内主题的好,最起码折腾起来不这么的麻烦.

效果是这样的

gaoliangforwordpress

代码

将以下代码放到你主题的 functions.php 文件中即可 ( 大量中文注释,不懂的请注意看 ).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
 * 搜索结果高亮关键字
 *
 * 特征: 简单的分词高亮效果
 *
 * 本函数摘自 wordpress 主题 PhilNa2 version 2.0.4
 *
 * @author yinheli
 * @link http://philna.com
 * @copyright Copyright (C) 2008 - 2009 yinheli Open Source Matters. All rights reserved.
 * @since 2.0
 * @version 1.5
 * @package PhilNa2
 * @lastmodified  $Date:2009-09-06 $
 * @see add_filter()
 */
function highlightSearchWords($c){
    /* 对于非搜索页面直接返回 */
    if(!is_search())
        return $c;
    global $wp_query;
    /* 测试的办法,你可以看到具体的全部请求内容 */
    //return print_r($wp_query,true);
    /* 颜色集合 */
    $hightLightColors = array('#FF0','#A0FF40','#FFD700','DAA520');
    $keywords = array();
    /* 取得关键字 */
    $keywords = $wp_query->query_vars['search_terms'];
    /* 非法字符 主要是特殊字符 */
    $notAllowed = array("$","(",")","*","+",".","?","[","]","\",","^","{","}","|");
    /* 没有关键字直接返回 */
    if (empty($keywords))
        return $c;
    /*
    对于想单(双)引号(',")
    这样的字符wp本身在查询的时候会去掉的.
    但是留下个空的值.并且会查询数据库
    暂时不知道为什么wp要这么处理
    猜想是:文章中难免有html标签,有标签意味着有引号.
    搜索引号就没有多大意义.
    原本以为加引号代表精确搜索,结果出现了乱码
    经测试发现是以上原因
 
    ∴ 这里做个判断.免得在替换的换的时候出错
    */
    /* 去掉空值 */
    foreach ($keywords as $index=>$val){
        if(empty($val))
            unset($keywords[$index]);
    }
    /* 依然为空 直接返回 */
    if (empty($keywords))
        return $c;
    /* 如果是搜索评论,去掉第一个关键字. 这里是针对我添加的评论搜索 */
    if(isset($wp_query->searchComments))
        array_shift($keywords);
    /* 选择颜色数组索引 */
    $slecet = 0;
 
    /*
    开始历遍,每个(种)关键字
    将从颜色集合数据组中选用使用不同的颜色
    注意:
    同一个关键字在文章不同的地方,颜色是相同的
    */
    foreach ($keywords as $keyword) {
        /* 关键字数量大于颜色数组数量时,索引重置 */
        if($slecet > (count($hightLightColors)))
            $slecet = 0;
        /* 选择一种颜色 */
        $hightLightColor = $hightLightColors[$slecet];
        /* 累加索引 */
        $slecet++;
        /* 滤过非法字符 必须将这些字符转义 */
        $RegExpkeyword = $keyword;
        foreach ($notAllowed as $v){
            $RegExpkeyword = str_replace($v,'\'.$v,$RegExpkeyword);
        }
        /* 正则表达式(这是替换[高亮]的关键) 不区分大写小写 */
        $RegExp = "/$RegExpkeyword(?=[^<>]*<)/i";
        /* 开始替换 */
        $c = preg_replace($RegExp,'<span style="background:'.$hightLightColor.';">'.$keyword.'</span>',$c);
    }
 
    return $c;
}
/*将函数挂到 the_content 这个滤过器上, 并将优先级设置高一点*/
add_filter('the_content', 'highlightSearchWords',100);

你也可以在我右上角搜索一下效果先。

分享到:

热门文章-HOT

    • @zwwooooo zww,我用谷歌自定义的不是不可以,但是我只要在CSE里一搜索, 我的sidebar就直接错位,无论在什么浏览器下,也就是真正显示sidebar的地方是空白,在该空白最下面才显示sidebar很是丑陋,我也想用CSE不知你能否给一些帮助。你可以直接回复该邮件

无觅相关文章插件,快速提升流量

.