大多数WordPress搜索表单设置了一个名为's'的查询字符串参数:

<form method="get" action="<?php bloginfo('url'); ?>">
<fieldset>
<input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
<button type="submit">Search</button>
</fieldset>
</form>

这没有什么不妥,我认为这是许多年来唯一的选择。

但是,如果没有插件的帮助,可以进行更高级的查询(尽管有很多可用的)。在WordPress核心深处,该应用程序解析了其他几个查询字符串参数,并使用它们返回一组更集中的搜索结果。有一些基本文档列出了参数名称:

  • attachment
  • attachment_id
  • author
  • author_name
  • cat
  • category_name
  • comments_popup
  • day
  • error
  • feed
  • hour
  • m
  • minute
  • monthnum
  • name
  • p
  • page_id
  • paged
  • pagename
  • post_parent
  • post_type
  • preview
  • second
  • static
  • subpost
  • subpost_id
  • tag
  • tag_id
  • tb
  • w
  • year

我并不认为所有这些工作都符合预期,有些是毫无意义的,但它们与您可以传递给WP_Query的参数相匹配。因此,我们可以使用带有smidgen的PHP创建一个高级搜索表单来自动化选项。

按类别优化搜索

您可以通过将其slug传递给category_name参数来将结果限制为类别,例如

http://yoursite.com/?s=search+term&category_name=kittens

我们的搜索表单允许用户优化搜索到特定类别:

<form method="get" action="<?php bloginfo('url'); ?>">
<fieldset>
<input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
<select name="category_name">
<option value="">all categories</option>
<option value="kittens">cute kittens</option>
<option value="puppies">adorable puppies</option>
</select>
<button type="submit">Search</button>
</fieldset>
</form>

如果您更愿意列出所有类别,请在<select></select>标记之间添加以下代码:

<?php
// generate list of categories
$categories = get_categories();
foreach ($categories as $category) {
	echo '<option value="', $category->slug, '">', $category->name, "</option>\n";
}
?>

按标签优化搜索

搜索结果可以通过将其slug传递给tag参数来限制为标记,例如

http://yoursite.com/?s=search+term&tag=cockroach

因此,您的搜索可能会将结果限制为某些标签,例如

<form method="get" action="<?php bloginfo('url'); ?>">
<fieldset>
<input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
<select name="tag">
<option value="">any tag</option>
<option value="cockroach">cockroaches</option>
<option value="snake">snakes</option>
</select>
<button type="submit">Search</button>
</fieldset>
</form>

同样,您可以为该select字段生成所有标记的列表:

<?php
// generate list of tags
$tags = get_tags();
foreach ($tags as $tag) {
	echo '<option value="', $tag->slug, '">', $tag->name, "</option>\n";
}
?>

推进高级搜索

如果要通过多个值优化搜索,该怎么办?例如,用户可以选择两个或多个标签,结果页面必须全部设置。我们无法单独使用URL参数来实现这一点,但我们首先要定义一个HTML搜索表单:

<form method="get" action="<?php bloginfo('url'); ?>">
<fieldset>
<input type="text" name="s" value="" placeholder="search&hellip;" maxlength="50" required="required" />
<p>Refine search to posts containing chosen tags:</p>
<?php
// generate list of tags
$tags = get_tags();
foreach ($tags as $tag) {
	echo 
		'<label>',
		'<input type="checkbox" name="taglist[]" value="',  $tag->slug, '" /> ',
		$tag->name,
		"</label>\n";
}
?>
<button type="submit">Search</button>
</fieldset>
</form>

请注意,我使用了一个名为的PHP数组参数taglist。您可以使用除WordPress已保留的名称之外的任何名称(请参阅上面的列表)。

我们现在可以在WordPress主题的functions.php文件中拦截搜索提交。该advanced_search_query函数检测搜索是否处于活动状态,然后相应地设置WP_Query tag_slug__and参数。

// advanced search functionality
function advanced_search_query($query) {

	if($query->is_search()) {
		
		// tag search
		if (isset($_GET['taglist']) && is_array($_GET['taglist'])) {
			$query->set('tag_slug__and', $_GET['taglist']);
		}
	
		return $query;
	}

}

最后,我们使用pre_get_postsaction钩子在执行advanced_search_query查询之前运行我们的函数:

add_action('pre_get_posts', 'advanced_search_query', 1000);

将高级搜索工具添加到WordPress非常容易,但很少有开发人员意识到这可能...... 也许是因为文档和示例有点稀疏。我偶然发现了它,所以我希望你在下一个WordPress项目中找到这个代码很有用。

via https://www.sitepoint.com/add-advanced-search-wordpress-site/

如何将高级搜索添加到您的WordPress站点
标签: