Php 将Woocommerce产品从搜索循环中排除

Php 将Woocommerce产品从搜索循环中排除,php,wordpress,woocommerce,Php,Wordpress,Woocommerce,我正在尝试创建一个自定义搜索结果页面,其中Woocommerce产品结果分别显示在博客/一般帖子中 我的目标是将它们显示为具有不同样式的独立块 [Block 1] - Woocommerce results [Block 2] - Blog / Post results 我已经设法在一个循环中显示产品,但我正在努力将产品从后循环中排除 我已经尝试创建一个自定义循环,但是这只是显示这些术语中的所有帖子,而不是搜索中返回的帖子 我通常使用的循环是: <?php $loop = new WP

我正在尝试创建一个自定义搜索结果页面,其中Woocommerce产品结果分别显示在博客/一般帖子中

我的目标是将它们显示为具有不同样式的独立块

[Block 1] - Woocommerce results

[Block 2] - Blog / Post results
我已经设法在一个循环中显示产品,但我正在努力将产品从后循环中排除

我已经尝试创建一个自定义循环,但是这只是显示这些术语中的所有帖子,而不是搜索中返回的帖子

我通常使用的循环是:

<?php $loop = new WP_Query( array( 'post_type' => 'post' ?>
    <p>Something here</p>
<?php endwhile; wp_reset_query(); ?>

您遇到的问题是您有一个主查询,实际上您需要执行两个查询。当然,您可以修改主查询以包含这两种帖子类型,但最终会得到两种帖子类型的随机数,您实际上希望填充这两个列

如果将主查询修改为仅返回其中一列,则最终会出现一种情况,即运行另一个查询来获取其余的帖子是非常糟糕的。我认为如果需要,您应该能够使用
posts\u join
posts\u where
过滤器,但我不确定
posts\u search
。您可以使用
WP\u Query
get\u posts
最终执行所需的两个查询

<?php
  // Since we are searching, we probably should get the search keyword
  $search = get_query_var('s');

  // Since we want to be able to navigate, we probably should figure out on which page we are
  $paged = get_query_var('paged');

  // Anything else we want to do in search queries we should be able to do in 
  // a posts_join or posts_where filter by checking if is_search() is true

  // With that out of the way, we can construct our queries
  $query_posts_page = new WP_Query([
    's' => $search,
    'paged' => $paged,
    'post_type' => ['post', 'page']
  ]);
  $query_woocommerce = new WP_Query([
    's' => $search,
    'paged' => $paged,
    'post_type' => 'product'
  ]);
?>
<div class="col">
  <?php
    if ( $query_posts_page->have_posts() ) {
      while ( $the_query->have_posts() ) {
        $query_posts_page->the_post();
        echo get_the_title();
      }

      /* Restore original Post Data */
      wp_reset_postdata();
    } else {
      echo 'Nope, no more data';
    }
  ?>
</div>
<div class="col">
  <?php
    if ( $query_woocommerce->have_posts() ) {
      while ( $query_woocommerce->have_posts() ) {
        $query_posts_page->the_post();
        echo get_the_title();
      }

      /* Restore original Post Data */
      wp_reset_postdata();
    } else {
      echo 'Nope, no more data';
    }
  ?>
</div>

显然,有一种解决方案可以在一个查询中同时获取blog/post/woocommerce,然后将它们拆分到各自的列中,但问题是,您很可能最终得到不均匀的列,甚至一个页面的空列。如果您希望对每个列都有单独的分页,则可以考虑使用Ajax,并在Ajax调用中对POST类型进行筛选。您将进行两次初始ajax调用来填充每一列。不,我不打算进行单独的分页。我计划在一个页面中返回所有结果,但只需分别设置它们的样式。您是否使用任何挂钩来修改搜索的主查询(例如
posts\u search
posts\u join
posts\u where
等)。这可能包括以任何方式修改搜索的插件。下面Sumurai8给出的答案看起来相当有帮助和实质性——这对你的问题有帮助吗?Woocommerce发布的产品类型只是“产品”…
<?php
  $maximum_page = max($query_posts_page->max_num_pages, $query_woocommerce->max_num_pages);
  for( $i = 1; $i < $maximum_page; $i++) {
    echo "{$i} ";
  }