构建您自己的自定义 WordPress 搜索

WordPress 搜索功能备受诟病,有许多插件可用于添加增强功能,但它们并不总能提供您想要的,尤其是当您尝试构建具有特定要求的辅助搜索引擎时.

在本文中,我们将了解构建您自己的自定义 WordPress 搜索是多么容易,并在此过程中发现一些令人惊讶的 WordPress 搜索秘密.

Photo of AMC Javelin customized blue hardtop with supercharged AMC V8.
拉动您的 WordPress 搜索!

尽管有许多插件可以增强 WordPress 搜索,从按相关性排序到添加方面搜索到在搜索中包含自定义字段,但在某些情况下,插件的任何组合都不能完全满足您的需求,而您只剩下别无选择,只能自己动手写.

在本文中,我将引导您完成一个自定义搜索案例研究.您会发现构建自己的搜索页面实际上并不难,并且您会发现内置搜索功能的一些隐藏功能.

但在我这样做之前,让我们来看看只需将自己的搜索表单放在一起即可实现什么.

通过扩展搜索表单扩展 WordPress 搜索

在 WordPress 搜索后面是 WP_Query 类.如果您以前使用自己的自定义循环做过任何工作,那么您可能会熟悉 WP_Query.

WP_Query 有一堆可能的参数,其中许多参数可以简单地在搜索表单中(或直接在 URL 上)指定,从而改变搜索行为.

例如,要将普通搜索转换为对名为产品的自定义帖子类型的搜索:

http://www.yoursite.com/?s=football&post_type=product

 

这只会返回标题或内容包含单词 footballproduct 自定义帖子的结果.

如果您查看 WP_Query 参数列表(它非常广泛),您会发现一大堆基于字符串和整数的参数,您可以简单地在 URL 上编写代码来更改搜索行为从包括和排除类别,到添加分类搜索到将搜索限制为某些作者.

[请记住,如果 s 参数包含在 URL 中,则仅是搜索.]

还有一些额外的参数没有列出,它们可以显着改变行为,但令人惊讶的是,这些参数并未记录在 Codex 中.

按短语搜索

默认情况下,WordPress 按关键字搜索.这意味着当通过搜索查询 football boots 时,WordPress 为 WHERE 子句构建以下内容:


((wp_posts.post_title LIKE '%football%') OR
(wp_posts.post_content LIKE '%football%'))
AND
((wp_posts.post_title LIKE '%boots%') OR
(wp_posts.post_content LIKE '%boots%'))

如您所见,这不是短语搜索,而是在标题或内容中查找 football 和在标题或内容中查找 boots 的搜索.因此,标题中包含 boot 且内容中包含 football 的帖子将匹配,这可能不是搜索者真正想要的.

但是,您可以让 WordPress 进行短语搜索,只需将 sentence=1 添加到将 WHERE 子句更改为的 URL 中:


((wp_posts.post_title LIKE '%football boots%') OR
(wp_posts.post_content LIKE '%football boots%'))

现在搜索的是短语,并且标题或内容必须实际包含 football boots 才能被找到.通过搜索然后将 &sentence=1 添加到 URL 中,在您自己的网站上尝试此操作,看看这对结果有何影响.

寻找精确匹配

sentence相关,但更具体的是exact.将 exact=1 添加到 URL 会将 WHERE 子句更改为:


((wp_posts.post_title LIKE 'football boots') OR
(wp_posts.post_content LIKE 'football boots'))

与其说区别,我会告诉你,sentenceWHERE 子句和 exactWHERE 子句之间的唯一区别是删除了 % 围绕 LIKE 语句中的短语.但是,这种删除会产生很大的不同,因为现在标题或内容必须与搜索查询匹配,而不仅仅是包含它.

因此,如果没有产品具有标题football boots,则不会有任何结果.谨慎使用精确.

自定义搜索表单

默认的 WordPress 搜索表单非常简单:

<form role="search" method="get" id="searchform" class="searchform" action="http://www.test.dev/">
<div>
<label class="screen-reader-text" for="s">搜索:</label>
<输入类型="text" value="" name="s" id="s"/>
<输入类型="提交" id="搜索提交" 值="搜索"/>
</div>
</form>

 

如果我们想改变搜索行为,那么,我们需要做的就是将我们自己的字段添加到表单中.

<form role="search" method="get" id="searchform" action="http://www.test.dev/">
<div>
<label for="s">搜索:</label>
<输入类型="text" value="" name="s" id="s"/>
<输入类型="隐藏" 值="1″ 名称="句子"/>
<输入类型="隐藏"值="产品"名称="post_type"/>
<输入类型="提交" id="搜索提交" 值="搜索"/>
</div>
</form>

 

此搜索表单在提交后将生成以下 URL:

http://www.test.dev/?s={query}&sentence=1&post_type=product

它仍会调用默认搜索结果页面,但这些结果将针对在标题或内容中包含搜索短语的产品自定义帖子类型.

构建您自己的搜索表单的最简单方法(假设您想保留默认表单)是创建一个新的页面模板,其中包含根据您的要求编码的搜索表单并将其分配给特定页面.

但是,如果您想更新默认搜索表单(例如触发短语搜索),假设您的模板没有将搜索表单硬编码到模板中,您有两个选择:

  1. 第一个是将您的自定义搜索表单放入名为 searchform.php 的模板文件中.每当调用 get_search_form() 函数时,它都会首先查找并使用该模板.
  2. 第二种是使用get_search_form过滤器替换,强制WordPress使用你的自定义搜索表单.

这两种技术都详细描述 在 WordPress 法典中.

当自定义表单不够用时

虽然您可以使用自定义表单做很多事情,但在某些情况下您需要自己构建 WP_Query 并处理结果,尤其是在添加第二个搜索功能时.

案例研究背景

本案例研究涉及一家销售实体和数字产品组合的组织的电子商务网站.大多数数字产品是两本杂志的过刊,以及纸质和数字格式的小册子.

该组织希望提供一种"图书馆"搜索功能,允许访问者仅在杂志和小册子中搜索某些短语(杂志的内容中有完整的内容列表).虽然该网站已经进行了产品搜索,但结果不太令人满意,因为:

  • 经常有太多不相关的结果
  • 包括所有产品
  • 没有指明搜索词的匹配位置,搜索结果只是产品图片

为了让当前的搜索保持完整,我们构建了一个新的搜索功能:

  • 强制按词组而非关键字搜索
  • 将搜索限制为杂志和小册子类别
  • 显示并突出显示包含搜索词组匹配的文本

前两个要求实际上可以通过以下自定义搜索表单来实现:

<form role="search" method="get" id="searchform" action="http://www.test.dev/">
<div>
<label for="s">搜索:</label>
<输入类型="text" value="" name="s" id="s"/>
<输入类型="隐藏" 值="1″ 名称="句子"/>
<输入类型="隐藏"值="产品"名称="post_type"/>
<input type="hidden" value="product_cat" name="magazines,books"/>
<输入类型="提交" id="搜索提交" 值="搜索"/>
</div>
</form>

但是,这对搜索列表布局和搜索短语的突出显示没有帮助,因此构建了一个新的页面模板并将其分配给一个新的专用页面.

模板中的主要逻辑如下:

如您所见,该表单几乎是标准的 WordPress 表单,因为对 WP_Query 调用的所有操作都是通过以下编码完成的:

  • post_type 设置为产品
  • sentence 设置为 1 以触发词组搜索
  • 添加了分类参数以将搜索限制为三个产品类别
  • ordering 设置为 date 和 menu_order 降序
  • 所有帖子都将被退回

请务必注意,此解决方案中没有分页.对于自定义的特定搜索,分页并不总是必要的,尤其是在触发短语搜索的情况下.

一旦 WP_Query 被执行,它就是输出任何搜索结果的问题.您会注意到,如果没有搜索结果,则会显示一些相关产品,以尝试将访问者留在页面上.

输出结果需要两个额外的功能,一个是提取包含匹配搜索短语的文本,另一个是突出显示短语本身.

只需使用简单的正则表达式即可突出显示短语.

提取包含搜索短语的文本并不容易.每个产品的内容都使用了一种标准方法,即在带有标题和描述的无序列表中列出内容,但试图找到一个正则表达式来拉出列表项,这对我有很大帮助,所以我求助于字符串操纵.

不过,结果还是不错的:

Screenshot of a search results page with phrase highlighting
按短语而不是关键字搜索可显着提高结果

当您想要第二次搜索时自定义完美

自定义搜索表单和功能非常适合您想要添加第二个搜索功能以与主要搜索功能一起运行并且有非常具体的要求.

在许多情况下,您可以通过简单地使用自定义搜索表单来实现您想要的,该表单将适当的参数传递给内置的搜索功能.在开始构建自己的自定义搜索功能之前,您可以轻松地对此进行测试,方法是将适当的查询变量添加到标准搜索 URL 并查看是否获得所需的结果.

也就是说,编写自己的搜索功能并不难,而且您可以访问更大范围的参数来控制搜索行为.

标签:

9

发表回复