使用PRE_GET_POST重写搜索查询以显示来自多个分类的帖子

时间:2014-03-20 作者:Jairus Khan

这似乎应该很简单,但我坚持到底了!

如果用户搜索“alice”,我想向他们显示所有带有自定义分类术语“bob”和“carol”的帖子,无论这些帖子中是否包含字符串“alice”。

我可以设置查询的tax\\u查询,使其仅显示以“bob”和“carol”为术语的帖子,但我无法重置实际搜索查询,使其显示所有帖子,而不仅仅是包含“alice”的帖子。

这是我用来更改tax\\u查询的筛选器:

if ( !$query->is_search )
    return $query;

$taxquery = array(
    \'relation\' => \'OR\',
    array(
        \'taxonomy\' => \'people\',
        \'field\' => \'slug\',
        \'terms\' => array( \'bob\' ),
    ),
    array(
        \'taxonomy\' => \'people\',
        \'field\' => \'slug\',
        \'terms\' => array( \'carol\' ),
    )
);

$query->set( \'tax_query\', $taxquery );
return $query;
但使用此设置搜索查询不起作用:

$queryvars = array(
        \'s\' => \'\'
);
$query->set( \'query_vars\', $queryvars );

1 个回复
SO网友:gmazzap

因为你不能使用set 更改所有查询变量。最简单的方法是设置\'s\' 到空字符串:

add_action( \'pre_get_posts\', function( $query ) {

  if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
    $taxquery = array( ... );
    $query->set( \'tax_query\', $taxquery );
    $query->set(\'s\', \'\' );
  }

});
这样,WordPress仍然会将请求视为搜索,因此search.php 模板将用于显示结果,如果您调用is_search() 结果将是TRUE.

如果您希望WordPress不再考虑搜索请求,您还需要手动取消设置$query->query_vars[\'s\'] 和设置$query->is_search 若为false:

add_action( \'pre_get_posts\', function( $query ) {

  if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
    $taxquery = array( ... );
    $query->set( \'tax_query\', $taxquery );
    $query->set(\'s\', \'\' );
    unset( $query->query[\'s\'] );
    $query->is_search = FALSE;
  }

});
这样,WordPress将不再将该请求视为搜索,而是使用index.php 作为模板。

如果要使用其他模板,例如。taxonomy.php 您需要使用\'template_include\' 过滤器:

add_action( \'pre_get_posts\', function( $query ) {

  if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
    $taxquery = array( ... );
    $query->set( \'tax_query\', $taxquery );
    $query->set(\'s\', \'\' );
    unset( $query->query[\'s\'] );
    $query->is_search = FALSE;
    add_filter( \'template_include\', function() {
      return locate_template( \'taxonomy.php\' )
    }, 0 );
  }

});

结束

相关推荐

Advanced searching form

我正在尝试在前端页面上为用户创建一个高级搜索页面。我一直在努力寻找,但要找到一些教程或示例源代码并不容易。我发现可以在管理面板上放置一些过滤器。我正在寻找这样的前端用户。See this tutorial for admin panel我需要为用户创建这样的前端。这是自定义帖子类型搜索。有什么建议吗?教程,样例代码?感谢您抽出时间,祝您周末愉快;)