WordPress 整合 Google Ajax 搜索

8 月 10 日, Ray Chow 发表于 小技巧, 84 回应

Google 自定义搜索提供了可定制性极强的搜索功能,可以与 WordPress 完美整合。在看了自力博客《WordPress 整合 Google 自定义搜索》一文后,我决定改造博客的搜索功能,减轻服务器负担。

与此同时,我参考了老肥博客的《打造完美的 AJAX 版 Google 自定义搜索》,在试验站上敲敲打打了一段时间,实现了如下功能:

  • 非搜索页面纯 HTML 代码,不加载不相关资源;
  • 搜索页面整合 Google 自定义搜索;
  • 搜索页面中,搜索结果随文字的输入动态呈现,无需单击」搜索「。

WordPress 整合 Google Ajax 搜索

一、申请 Google 自定义搜索

访问此处创建自定义搜索引擎,要搜索的网站可填入 www.example.com/*(www.example.com 为您的网站);

如果只要搜索文章页,固定链接的结尾需要有固定字符(如 .html),那么要搜索的网站可填入 www.example.com/*.html

在「外观」选项中,选择托管「搜索元素」、「两栏」布局并保存。

接下来,还可以在控制面板中修改搜索引擎的细节。尽管可以关掉广告,但该选项仅适用于已注册的非营利组织、大学和政府机构,建议不属于这些行列的博客,在「赚钱」选项中将搜索引擎与 Google Adsense 帐户关联,这样还能带来额外收入。

二、修改搜索框

不同的主题搜索框代码位置是不一样的,Mystique 搜索框放在单独的 searchform.php 中,其它的主题请自行寻找。

将搜索框代码替换成自己的内容,例如:

<form action="/search" id="searchbox">
    <input type="text" name="q" id="search-text" />
    <input type="submit" value="搜索" />
</form>

我是直接把 Google 的样式复制过来了,但注意各元素的 Class 不要与 Google 自动加载的 default.css 有重复,否则可能会变形的。

三、建立搜索结果页

1. 新建页面

在这一步,我认为将代码写入模板比直接写入页面要好,写入模板可以自定义整个页面,避免搜索页面出现评论模块的尴尬。

说件囧事,开始我把新建页面理解成在网站根目录新建一个文件了,还以为设定了 755 权限就可以执行,脑残了……

先在当前 WordPress 主题的目录下新建一个模板文件,文件名自定,如 cse.php,先在其中输入以下内容:

<?php /* Template Name: CSE */ ?>

接着在 WordPress 后台选择「添加新页面」,写好标题,将固定链接设定为 search(对应于搜索框代码中的 action),并选择「CSE」模板。

保存后查看页面,正确的话应该一片空白。

2. 写入代码

把索引页模板(index.php)的内容插入到 cse.php 的结尾,删掉正文内容。

进入 Google 自定义搜索的「获取代码」,将下方文本框中的内容(用于显示搜索结果)插入 cse.php,再将上方文本框中第二行之后的内容(搜索引擎主程序)插入:

<div id="cse" style="width:100%;">载入中……</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
    google.load('search', '1', {language : 'zh-CN'});
    google.setOnLoadCallback(function() {
        var customSearchControl = new google.search.CustomSearchControl('000000000000000000000:00000000000');
        customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
        var options = new google.search.DrawOptions();
        options.setSearchFormRoot('cse-search-form');
        options.setAutoComplete(true);
        customSearchControl.draw('cse', options);
    }, true);
</script>
<link rel="stylesheet" href="http://www.google.com/cse/style/look/shiny.css" type="text/css" />

000000000000000000000:00000000000 应替换为 Google 自定义搜索控制面板基本信息中「搜索引擎的唯一 ID」。

现在这段代码还不能正常工作,它没有获得刚刚传来的搜索关键字,也没有设定使用 AJAX 搜索,需要做一点修改:

1) 获得关键字

通过 PHP 直接获得表单传入的数据:

var search = '<?php echo $_GET['q']; ?>';
2) 为 Google 指定搜索框

Google 提供了两种方式指定由 Google 使用的搜索框:

a. 替换搜索表单
options.setSearchFormRoot('cse-search-form');

cse-search-from 应替换为搜索表单 id,或者任何指定的 DOM 容器。

此方法存在一个非常雷人的问题,在 IE 中点击一次「搜索」按钮,搜索框居然变样了……方法 B 则无此问题。

b. 传递输入元素
options.setInput(document.getElementById('search-text')); // 传递输入元素
document.getElementById('searchbox').setAttribute('onSubmit',"document.getElementById('search-text').select(); return false;"); // 按下搜索按钮选中搜索框,并阻止表单提交
document.getElementById('search-text').value = search; // 设置搜索框的内容

其中 search-text 应替换为搜索文本框 id,searchbox 应替换为搜索表单 id。

该方法可以实现随文字输入动态改变搜索结果,此时搜索按钮实际上没有任何用处。

不过,如果打开了自动完成,搜索时按下回车会导致发生两次查询——尽管不用按回车,页面被刷新两次也很烦人,只要删除打开自动完成的代码即可:
options.setAutoComplete(true);

3) 执行搜索
customSearchControl.execute(search);
最后完工的代码
<div id="cse">载入中……</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
    google.load('search', '1', {language : 'zh-CN'});
    google.setOnLoadCallback(function() {
        var customSearchControl = new google.search.CustomSearchControl('000000000000000000000:00000000000');
        customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
        customSearchControl.setLinkTarget(google.search.Search.LINK_TARGET_SELF);
        var options = new google.search.DrawOptions();
        var search = '<?php echo $_GET['q'] ; ?>';
        // options.setSearchFormRoot('cse-search-form'); // Google 搜索框
        options.setInput(document.getElementById('search-text')); // 自定义搜索框
        document.getElementById('searchbox').setAttribute('onSubmit',"document.getElementById('search-text').select(); return false;"); // 自定义搜索框
        document.getElementById('search-text').value = search; // 自定义搜索框
        customSearchControl.draw('cse', options);
        customSearchControl.execute(search);
    }, true);
</script>

具体类与函数请参考 Google AJAX 搜索 API 开发人员指南,其中还有不少有趣的示例。

最后,就剩下美化工作啦,我就偷懒直接使用自带样式,也挺搭的~

番外:超简单侧边栏 AJAX 搜索

本来我用的这方法的,但有个弊端就是每个页面都要加载与搜索有关的 JS。

在「外观」选项中,选择「压缩视图」布局,单击「获取代码…」,将代码直接放入「文本」小工具中,立刻实现 AJAX 无刷新的搜索。

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

固定链接: http://beamnote.com/2010/wordpress-goo-gle-ajax-search.html

订阅本文 RSS 以获取最新动向。

发表评论或者发送 Trackback

84 回应

  1. 测试了一下,现在使用的就是谷歌的自定义搜索吗?

  2. 在WP博客中使用Google搜索…

  3. [...] 本来呢我是想弄Google CSE自定义搜索引擎来代替网站自身的搜索服务的,那时候对WordPress很陌生,结果呢就不提了,大家知道的。最早知道Google Ajax搜索是从老肥的”打造完美的 ajax 版 Google 自定义搜索”,那时候看得我一头的雾水,但是直觉告诉我这个功能很炫,所以呢,就将其添加进了书签,它这一躺就将近二个月。在Z-Turn上线测试后,就突然想起它了,然后又开始折腾,Z-Turn。在Google的帮助下又让我找到光线部落的“WordPress 整合 Google Ajax 搜索”,并按照此方法成功,大家可以测试下。实现的功能如下: [...]

  4. 哥的博客被盗图了,真讨厌

  5. 谷歌厚道,但是被天朝挡在国门之外,这个很揪心

  6. google东西其实挺好的。

  7. 应该是我这周看到的第五篇介绍google自定义搜索的文章了。。 :eek:

  8. 个人感觉这个没什么用,比较搜索博客的也没几个人,又能增加什么负荷呢?

  9. 原来如此,学习了!!! :!: :smile: :oops: :grin:

发表评论

必填区域以 * 标出

*
*