现自己搜自己的东西的时候有时都很难找出来,也可以说是目的, 让用户搜索的结果更加一目了然.不知道为什么响当当的wordpress在这个功能上还这么的吝啬当然首先想到的就是谷歌的自定议搜索,这个很给力,能高亮关键字,但是无奈对着几乎所有的教程在我的小站上加一个cse都显得哪么的困难,可能是我的主题的关系总是走位,难看至极.后来看到万戈的站内搜索高亮关键字的文章去试了一下,这下高亮是能高亮了,但在我的主题,下会搜出若干一模一模的重复日志,直到我看到了philna的方法,才能算是基本小有效果,暂且就这样吧,日后还是用国内主题的好,最起码折腾起来不这么的麻烦.
效果是这样的
代码
将以下代码放到你主题的 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); |
你也可以在我右上角搜索一下效果先。
支持 再顶
不错不错 学习了。。
用谷歌自定义搜索的漂过。。
比较实用的方法啊,真是不错
你用的google search啊
@Jessy 最近刚换的,不过自带的搜索和CSE各有千秋
这个相当有用的其实
看见万戈也有这个功能
好文章!支持博主!
发现个问题 77行
‘\’有个问题 应该是’\ ‘
\ 后面应该有个空格 否则会出错的 ==!
不错,学习了,不知道ZBLOG有没有办法
@钱汉子 ZBLOG也是这样的吗?
好东西 这个要支持!
懒得折腾,还是用google自定义
@zwwooooo zww,我用谷歌自定义的不是不可以,但是我只要在CSE里一搜索, 我的sidebar就直接错位,无论在什么浏览器下,也就是真正显示sidebar的地方是空白,在该空白最下面才显示sidebar很是丑陋,我也想用CSE不知你能否给一些帮助。你可以直接回复该邮件
@zwwooooo 你可以http://www.yesure.net/cse帮我看一下,谢谢
用的google自定义搜索
@软件盒子 自定义搜索用了很多招了,但在我的主题下老走位,换主题,太麻烦