【问题标题】:Exclude Woocommerce products from search loop从搜索循环中排除 Woocommerce 产品
【发布时间】:2018-05-18 09:15:46
【问题描述】:

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

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

[Block 1] - Woocommerce results

[Block 2] - Blog / Post results

我已经设法在一个循环中显示产品,但我正在努力从 post 循环中排除产品。

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

我常用的循环是:

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

但是我认为这不兼容并且不适合我的需求。

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

【问题讨论】:

  • 显然有一种解决方案,即在一个查询中同时获取 blog/post/woocommerce,然后将它们拆分到各自的列中,但问题是您很可能最终得到不均匀的列,或者甚至是一页的空列。如果您打算为每列单独分页,您可以考虑使用 ajax,并在该 ajax 调用中过滤帖子类型。您将执行两次初始 ajax 调用来填充每一列。
  • 不,我不打算单独分页。我计划在一页中返回所有结果,但只是分别设置样式
  • 您是否使用任何挂钩来修改搜索的主查询(例如posts_searchposts_joinposts_where 等)。这可能包括以任何方式修改搜索的插件。
  • 嗨查理。 Sumurai8 的以下答案看起来很有帮助且内容丰富 - 这对您的问题有帮助吗?

标签: php wordpress woocommerce


【解决方案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} ";
  }

【讨论】:

  • Woocommerce 产品的帖子类型只是“产品”...
猜你喜欢
  • 2019-02-06
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2015-03-23
相关资源
最近更新 更多