我正在尝试创建一个搜索表单/过滤器,允许访问者按特定标签进行搜索。
我已实施此解决方案:
<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使其工作:
// 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; }
}
add_action(\'pre_get_posts\', \'advanced_search_query\', 1000);
但是,它会显示所有标记。我如何通过ID获得特定的标签供访客选择?
SO网友:Matt van Andel
解决方案
1) 首先,确保您使用的是刚刚发布的WordPress 4.3,否则将无法使用。
2) 第二,放下整个pre_get_posts
胡克,你不需要它。WordPress将根据您在querystring中包含的术语自动过滤搜索存档(这是我刚才提到的4.3功能)。
3) 接下来,将您的呼叫替换为$tags = get_tags()
使用以下内容…
$tags = get_tags(
array(
\'include\' => array( 1, 17, 22 )
)
);
只需更改
include => array()
数组仅使用所需的标记/术语ID…或者,您可以更改
include
到
exclude
显示除指定标记以外的所有内容。
4) 最后,将复选框输入的名称更改为tag[]
.
我们所做的前提是:WordPress 4.3将根据您传递给它的querystring值数组自动过滤存档页(包括搜索结果)。这包括,例如,“例如;标记“”;。
所以,我们可以告诉get_tags()
函数仅获取我们指定的特定标记。它将关联数组作为参数,其中之一是include
, 它只接受另一个您希望它返回的标记ID数组。
为了将其联系在一起,我们需要确保表单正在构建WordPress期望的适当查询字符串。类似于yoursite.com/blog/?s=your+search+terms&tag%5B%5D=foo&tag%5B%5D=bar
为了实现这一点,我们只需确保复选框的名称tag[]
- 查询字符串将正确格式化,然后由WordPress捕获,WordPress将使用它过滤搜索结果。