在显示前处理搜索结果的简单方法

时间:2016-07-04 作者:Sam

我的网站上有几个搜索表单,我希望它们显示不同的结果。我的网站有一个非常严格的层次结构,父网站上的搜索表单应该只显示其子页面的结果。

我的计划是在包含特定页面id的不同父页面上包含不同的隐藏字段。在search.php 然后我想处理结果,过滤掉与父页面无关的页面和帖子。

有没有一种简单的方法可以实现这一点?

提前谢谢。

EDIT 1<这是我的search.php

<?php 
if (have_posts()){
  while(have_posts()){
    the_post(); ?>
    <div>
      <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
      <p><?php echo get_the_author(); ?> - <?php echo get_the_date(); ?></p>
      <p><?php echo get_the_excerpt(); ?></p>
    </div>
    <?php
  }
} else{ ?>
  <h3>Sorry</h3>
  <p>We are sorry but we could not find any matching articles on our site. Please try again with an other search request.</p>
  <?php
    get_search_form ();
}
?>
以及searchform.php:

<form role="search" method="get" id="searchform" action="<?php echo esc_url( home_url( \'/\' ) ); ?>">
  <label>Search...</label>
  <input type="text" name="s" id="s" value="<?php echo get_search_query(); ?>" placeholder="Search..." />
  <input type="hidden" name="post_parent" value="<?php echo (int)get_the_ID(); ?>" />
  <button type="submit"><i class="fa fa-search" aria-hidden="true"></i></button>
</form>

EDIT 2

我还补充道<?php wp_reset_query(); ?>if(have_posts()){}. 这不会导致任何变化。页面仍会显示。

2 个回复
SO网友:user1049961

您可以使用pre_get_posts 筛选以筛选出您需要的内容。在Codex中有一个关于如何做到这一点的示例:

https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts#Exclude_Pages_from_Search_Results

function search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set(\'post_type\', \'post\');
    }
  }
}

add_action(\'pre_get_posts\',\'search_filter\');
此外,this 文章可能会帮助您编辑搜索表单。。。

SO网友:Tom J Nowell

pre_get_posts 过滤器将允许您在主查询发生之前修改它,允许您添加额外的要求,在这种情况下,这是不必要的!您可以使用URL和搜索表单来完成这一切

首先,将查询变量传递到WP_Query 可以在URL中使用。post_parent 成为您想要的查询变量。

如果我们有这个:

<form action="/" method="get">
    <input type="text" name="s" />
    <input type="hidden" name="post_parent" value="<?php echo (int)get_the_ID(); ?>"/>
    <input type="hidden" name="post_type" value="page"/>
</form>
然后,任何搜索结果都将限于那些post\\u父级是搜索来源页面的用户。您将看到URL,如/?s=test&post_parent=123.

此技巧可用于按类别和作者过滤,例如,搜索类别:

/category/example/?s=test

仅显示日期存档中特定作者的帖子:

/2016/?author=123