允许访问者按多个标签(特定ID)进行搜索

时间:2015-08-20 作者:Jeremia

我正在尝试创建一个搜索表单/过滤器,允许访问者按特定标签进行搜索。

我已实施此解决方案:

<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获得特定的标签供访客选择?

1 个回复
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…或者,您可以更改includeexclude 显示除指定标记以外的所有内容。

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将使用它过滤搜索结果。

结束

相关推荐

Order posts by tags count?

我正在尝试按标签数量订购帖子。我想先订购没有标签的帖子,最后订购计数最高的帖子。我试过了,只得到了没有标签的帖子。 $tags = get_tags(); $tag_ids = wp_list_pluck( $tags, \'term_id\' ); $args1 = array ( \'orderby\' => \'DEC\', \'post_type\' => \'p