WordPress 整合 Google Ajax 搜索

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

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

80 回应

  1. 谢谢,已经用上了。 :smile:

  2. zhenyu

    :twisted:

    很久的帖子了噢,才看到呢,因为也在琢磨ajax,可是有点晕.

    作者已经添加了页面/search,怎么还说是ajax google搜索呢? ajax的最大特性就是在当前页面加载文件啊.

    不知道 说得对不对 呵呵

发表评论

必填区域以 * 标出

*
*