从搜索循环中排除Woocommerce产品

时间:2017-12-04 20:16:15

标签: php wordpress woocommerce

我正在尝试创建一个自定义搜索结果页面,其中Woocommerce产品结果会单独显示在博客/常规帖子中。

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

$channels = explode('"', $string_array);

foreach($channels as &$channel) {
    echo $channel.'<br>';
}

我设法在一个循环中显示产品,但我很难从post循环中排除产品。

我已尝试创建自定义循环,但这只会显示这些字词中的所有帖子,而不是搜索中返回的帖子。

我经常使用的循环是:

[Block 1] - Woocommerce results

[Block 2] - Blog / Post results

但我相信这并不适合我的需要。

如果有更好的解决方法来分离这些,我绝对希望听到更多。

1 个答案:

答案 0 :(得分:1)

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

如果您将主查询修改为仅返回其中一列,则最终会出现运行其他查询以获取其余帖子的情况。我认为您应该能够使用posts_joinposts_where过滤器,但我不确定posts_search。您可以使用WP_Queryget_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>

然而还有另一个问题。考虑到我们正在运行两个自定义查询而不是主查询,我们无法自动生成分页。此外,我们不太可能拥有相同数量的正常页面/帖子和产品。

我们可以使用max_num_pages找出每个循环的最大页数。您可以使用它自己生成一些东西。

<?php
  $maximum_page = max($query_posts_page->max_num_pages, $query_woocommerce->max_num_pages);
  for( $i = 1; $i < $maximum_page; $i++) {
    echo "{$i} ";
  }