按帖子类型显示搜索计数

时间:2016-07-17 作者:Corey

所以我在我的一个Wordpress网站上进行了正常的搜索。

我知道如何通过以下方式获得帖子总数:$wp_query->found_posts 但我想知道如何获得每种帖子类型的总数?

例如:

14 Total Results
10 Post Results
4 Page Results

Edit

目前已找到解决方案,但很想知道是否有一种方法可以做到这一点,而无需运行2个查询。基本上,我是在正常搜索结果循环之前这样做的。

<?php
  $args = array( 
    \'s\' => $_GET[\'s\'], 
    \'posts_per_page\' => -1
  );
  $my_query = new WP_Query( $args );
  $types = array();                 
  if( $my_query->have_posts() ) {
    while ($my_query->have_posts()) : $my_query->the_post();
      $types[$post->post_type]++;
    endwhile;
  }
?>

1 个回复
SO网友:Tom J Nowell

实际上,您正在两次运行同一个查询,而不是循环第二个查询,为什么不循环$wp_query?

$types = array();                 
if( have_posts() ) {
    while (have_posts()) {
        the_post();
        if ( empty( $types[$post->post_type] ) {
            $types[$post->post_type] = 0;
        }
        $types[$post->post_type]++;
    }
    wp_reset_postdata();
    rewind_posts();
}
你会注意到我添加了三件事:

您问题中的代码生成通知和警告,$type 是一个空数组,当您第一次尝试递增post类型计数时,没有现有值(毕竟数组是空的,对吗?没有要递增的内容)

  • 无论何时调用the_post 在自定义查询中,您需要调用wp_reset_postdata, 我在这里添加了它,因为我们将把主查询倒回开始处,但这应该始终放在if语句中,如果没有进行任何清理,则不希望进行清理。有些人会使用wp_reset_query. 该函数用于在调用query_posts. 从不使用query_posts, and by conjunction you should never need to usewp\\u reset\\u query `一个if语句
  • 我添加了一个调用rewind_posts, 这会将主循环倒回起始位置,以便您可以再次循环。请注意,我将其放在if语句中,仅当有要回放的内容时才回放。或者,循环$wp_query->posts. 请注意,使用循环更为优雅,而且这可能不是一个简单的数组,在其上循环可能会由于以下方式而影响性能WP_Post 对象工作

    global $wp_query;
    $types = array();                 
    if( !empty( $wp_query->posts ) ) {
        foreach ($wp_query->posts as $p ) {
            if ( empty( $types[$p->post_type] ) {
                $types[$p->post_type] = 0;
            }
            $types[$p->post_type]++;
        }
    }
    
    从这里可以进行一些明显的重构,例如,创建一个采用WP_Query 对象并返回一个计数数组,使您可以对任何查询执行此操作,而不仅仅是主查询,并使代码更易于阅读

  • 相关推荐

    nothing happen in search form

    我想创建搜索表单,但当我搜索时什么都没有发生,这是代码:索引。php: <div class=\"tech-btm\"> <?php get_search_form();?> </div> 搜索表单:<form role=\"search\" method=\"get\" id=\"searchform\" action=\"<?php echo home_url(\'/\')?>\"> &