大多数WordPress搜索表单设置了一个名为's'的查询字符串参数:
<form method="get" action="<?php bloginfo('url'); ?>">
<fieldset>
<input type="text" name="s" value="" placeholder="search…" 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…" 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…" 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…" 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_posts
action钩子在执行advanced_search_query
查询之前运行我们的函数:
add_action('pre_get_posts', 'advanced_search_query', 1000);
将高级搜索工具添加到WordPress非常容易,但很少有开发人员意识到这可能...... 也许是因为文档和示例有点稀疏。我偶然发现了它,所以我希望你在下一个WordPress项目中找到这个代码很有用。
via https://www.sitepoint.com/add-advanced-search-wordpress-site/