如何编辑用户当前所在类别的PRE_GET_POST?

时间:2016-05-09 作者:T.Doe

我有一个Woocommerce网站,它使用这些类别中的类别和产品,但如何让我的搜索表单只显示用户当前所在类别中产品的结果。我环顾四周,最接近的是:

add_action(\'pre_get_posts\',\'shop_filter_cat\');

function shop_filter_cat($query) {
  if (!is_admin() && is_post_type_archive( \'product\' ) && $query >is_main_query()) {
    $query->set(\'tax_query\', array(
                array (\'taxonomy\' => \'product_cat\',
                                   \'field\' => \'slug\',
                                    \'terms\' => \'type-1\'
                             )
                 )
    );   
  }
}
这很好,但我不想将类别指定为“terms”=>“type-1”,我希望搜索只显示用户当前所在产品的结果,例如,如果用户选择t恤作为类别,然后搜索“蝙蝠侠”,我希望搜索结果只显示蝙蝠侠t恤的结果,而不是蝙蝠侠帽的结果或任何其他结果。提前非常感谢!!

HTML(my searchform.php):

<form role="search" method="get" class="search-form" action="<?php echo home_url(); ?>">

    <input type=\'textbox\' name="s" class="form-control form-inline" id="item-search" value="<?php the_search_query();?>" placeholder="Search items.."/>
    <button class="item-search-btn"><span class="glyphicon glyphicon-search"></button>
    <?php
      if ( function_exists( \'woocommerce_product_search\' ) ) {
        echo woocommerce_product_search( array( \'limit\' => 40 ) );
      }
    ?>
</form>

1 个回复
SO网友:Tom J Nowell

你不需要!只要稍微了解一下URL和查询变量的工作原理,我们就可以完全在页面的URL中完成这项工作,而无需额外的PHP代码

首先,我们有一个URL:

example.com/abc/123
然后我们有一个重写规则。该规则有一个与URL匹配的regex模式,第二个位表示所有匹配的位都是go,例如。

"/abc/(.+)" -> "index.php?p=$match[1]"
这将提供转换/abc/123 进入index.php?p=123, 成为WP_Query( array( \'p\' => 123 ) ). WordPress然后查看新的WP_Query, 使其成为主查询(post循环),并执行一些逻辑来决定加载哪个模板。在这种情况下,它会看到p 并宣布这是singular 页码,sosingle.php 可能会加载。有关这方面的更多详细信息,请参阅模板层次结构。

重要的是,我们可以传递额外的参数!/abc/123 匹配,但也匹配/abc/123?s=test. 这导致index.php?p=123&s=test, 和WP_Query( array( \'p\' => 123, \'s\' => \'test\')).

自从s 是搜索查询参数,我们可以使用这些新发现的知识来做您需要的事情!

因此,假设您的用户属于tshrit类别,其URL为:

example.com/product-category/tshirts
我们可以使用

example.com/product-category/tshirts?s=test
现在,我们搜索了T恤产品类别中的“测试”。这很好,因为现在我们有了一个URL,它始终是该类别的搜索。我们可以在cookie或会话中跟踪tshirt类别,但这将导致一个URL向不同的人显示多个内容,以及随之而来的所有缓存问题和SEO问题。

我们如何构建搜索表单?

<form action="" method="get">
    <input type="text" name="s" value="<?php echo get_search_query(); ?>">
</form>
注意两件事:

文本输入具有名称saction 属性为nothing,并让浏览器处理它。我指定了该值,以便您知道刚才使用get_search_queryPOST