按类别对搜索结果进行分组

时间:2017-02-08 作者:Justin Picard

对于客户端,我需要按类别对搜索结果页面上的结果进行分组。在这种情况下,它不是帖子,而是pages 从具有Add Tags And Category To Page And Post Types 插件。

这是未编辑的搜索结果页面模板:

    <div id="content">

    <div id="inner-content" class="wrap cf">

        <main id="main" class="m-all t-2of3 d-5of7 cf" role="main">
            <h1 class="archive-title"><span><?php _e( \'Search Results for:\', \'bonestheme\' ); ?></span> <?php echo esc_attr(get_search_query()); ?></h1>

            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>

                <article id="post-<?php the_ID(); ?>" <?php post_class(\'cf\'); ?> role="article">

                    <header class="entry-header article-header">

                        <h3 class="search-title entry-title"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>

                            <p class="byline entry-meta vcard">
                                    <?php printf( __( \'Posted %1$s by %2$s\', \'bonestheme\' ),
                                    /* the time the post was published */
                                    \'<time class="updated entry-time" datetime="\' . get_the_time(\'Y-m-d\') . \'" itemprop="datePublished">\' . get_the_time(get_option(\'date_format\')) . \'</time>\',
                                        /* the author of the post */
                                        \'<span class="by">by</span> <span class="entry-author author" itemprop="author" itemscope itemptype="http://schema.org/Person">\' . get_the_author_link( get_the_author_meta( \'ID\' ) ) . \'</span>\'
                                    ); ?>
                            </p>

                    </header>

                    <section class="entry-content">
                            <?php the_excerpt( \'<span class="read-more">\' . __( \'Read more &raquo;\', \'bonestheme\' ) . \'</span>\' ); ?>

                    </section>

                    <footer class="article-footer">

                        <?php if(get_the_category_list(\', \') != \'\'): ?>
                        <?php printf( __( \'Filed under: %1$s\', \'bonestheme\' ), get_the_category_list(\', \') ); ?>
                        <?php endif; ?>

                        <?php the_tags( \'<p class="tags"><span class="tags-title">\' . __( \'Tags:\', \'bonestheme\' ) . \'</span> \', \', \', \'</p>\' ); ?>

                    </footer> <!-- end article footer -->

                </article>

            <?php endwhile; ?>

                    <?php boilerplate_page_navi(); ?>

                <?php else : ?>

                        <article id="post-not-found" class="hentry cf">
                            <header class="article-header">
                                <h1><?php _e( \'Sorry, No Results.\', \'bonestheme\' ); ?></h1>
                            </header>
                            <section class="entry-content">
                                <p><?php _e( \'Try your search again.\', \'bonestheme\' ); ?></p>
                            </section>
                            <footer class="article-footer">
                                    <p><?php _e( \'This is the error message in the search.php template.\', \'bonestheme\' ); ?></p>
                            </footer>
                        </article>

                <?php endif; ?>

            </main>

                <?php get_sidebar(); ?>

        </div>

</div>
这就是我如何在一点帮助下走到现在的:

<div id="content">

<div id="inner-content" class="wrap cf">

    <main id="main" class="m-all t-2of3 d-5of7 cf" role="main">

        <h1 class="archive-title"><span><?php _e( \'Search Results for:\', \'boilerplate\' ); ?></span> <?php echo esc_attr(get_search_query()); ?></h1>


    <?php
      $list_per_category = [];

      $search_filters = array(
        \'post_type\' => \'page\' // Doorzoekt alle post types
      );

      $search_result = new WP_Query( $search_filters );

    //var_dump($search_result);

      if ($search_result->have_posts()) : while ($search_result->have_posts()) : $search_result->the_post();

        //Genereer de html voor het zoekresultaat van de post, en bewaar deze in een buffer
        ob_start(); ?>

          <article>

            <?php // create our link now that the post is setup ?>
              <h4 class="search-title entry-title"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h4>

            <?php the_excerpt( \'<span class="read-more">\' . __( \'Read more &raquo;\', \'boilerplate\' ) . \'</span>\' ); ?>
          </article>
          <?php

          $post_html = ob_get_clean();

        //Loop de hoofdcategorieen van de post door en maak hier een overkoepelende structuur voor aan die we kunnen gebruiken voor de lijstweergave van het zoekresultaat.
        $post_categories = get_the_category();
        foreach ($post_categories as $post_category) :
          if($post_category->parent == 0):

            if (!isset($list_per_category[$post_category->term_id])):
              $list_per_category[$post_category->term_id][\'category\'] = $post_category;
              $list_per_category[$post_category->term_id][\'posts\'] = [];
            endif;

            $list_per_category[$post_category->term_id][\'posts\'][] = $post_html;

          endif;
        endforeach;

      endwhile;


      //Doorloop de gemaakte structuur van posts per category en toon deze
      foreach ($list_per_category as $list_item) :

        echo \'<div class="category\' . $list_item[\'category\']->slug . \'">
            <h2>\' . $list_item[\'category\']->name . \'</h2>\';

        foreach ($list_item[\'posts\'] as $post_html) :
          echo $post_html;
        endforeach;

        echo \'</div>\';
      endforeach;


      else : ?>

          <article id="post-not-found" class="hentry cf">
              <header class="article-header">
                  <h1><?php _e( \'Sorry, No Results.\', \'bonestheme\' ); ?></h1>
              </header>
              <section class="entry-content">
                  <p><?php _e( \'Try your search again.\', \'bonestheme\' ); ?></p>
              </section>
              <footer class="article-footer">
                  <p><?php _e( \'This is the error message in the search.php template.\', \'bonestheme\' ); ?></p>
              </footer>
          </article>

      <?php endif; ?>

    </main>

    <?php get_sidebar(); ?>

</div>

这里的问题是,列出的所有页面都有一个类别,而不仅仅是有一个类别的搜索结果。循环似乎缺少某种搜索查询参数。我想知道如何改进页面模板,使其按类别显示搜索结果。也许有一个比我上面发布的更简单的方法?

提前感谢!

2 个回复
SO网友:Industrial Themes

添加到search parameter 您的查询:

$search_filters = array(
   \'post_type\' => \'page\', // Doorzoekt alle post types
   \'s\' => $keyword // show only posts that meet the current search query
);
除此之外,您应该能够从查询字符串中获取关键字,如下所示:

$keyword = $_GET[\'s\'];
还有一个WordPressnative function 这将获取当前的搜索查询,使用该查询可能比从查询字符串中手动获取更好:

$keyword = get_search_query();

SO网友:Justin Picard

不幸的是,它还不能解决我的问题。当我在网站上搜索我确信的东西时,我什么也得不到。当没有搜索结果时,将按预期显示“no results”(没有结果)消息。

我只是无法想象我是唯一一个有这个问题的人,但关于这个问题我几乎找不到什么。

这是我现在的代码:`

    <div id="inner-content" class="wrap cf">

        <main id="main" class="m-all t-2of3 d-5of7 cf" role="main">
            <h1 class="archive-title"><span><?php _e( \'Search Results for:\', \'boilerplate\' ); ?></span> <?php echo esc_attr(get_search_query()); ?></h1>

            <?php
                $keyword = $_GET[\'s\'];
                $list_per_category = [];

                $search_filters = array(
                   \'post_type\' => \'page\', // Doorzoekt alle post types
                   \'s\' => $keyword // show only posts that meet the current search query
                );

                $search_result = new WP_Query( $search_filters );

                //var_dump($search_result);
            ?>

            <?php if ($search_result->have_posts()) : while ($search_result->have_posts()) : $search_result->the_post();

        //Genereer de html voor het zoekresultaat van de post, en bewaar deze in een buffer
        ob_start(); ?>

        <article>

            <?php // create our link now that the post is setup ?>
                  <h4 class="search-title entry-title"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h4>

            <?php the_excerpt( \'<span class="read-more">\' . __( \'Read more &raquo;\', \'boilerplate\' ) . \'</span>\' ); ?>
        </article>
        <?php

        $post_html = ob_get_clean();

        //Loop de hoofdcategorieen van de post door en maak hier een overkoepelende structuur voor aan die we kunnen gebruiken voor de lijstweergave van het zoekresultaat.
        $post_categories = get_the_category();

        foreach ($post_categories as $post_category) :

          if($post_category->parent == 0):

            if (!isset($list_per_category[$post_category->term_id])):
              $list_per_category[$post_category->term_id][\'category\'] = $post_category;
              $list_per_category[$post_category->term_id][\'posts\'] = [];
            endif;

            $list_per_category[$post_category->term_id][\'posts\'][] = $post_html;

          endif;

        endforeach;

      endwhile; 

      //Doorloop de gemaakte structuur van posts per category en toon deze
      foreach ($list_per_category as $list_item) :

        echo \'<div class="category\' . $list_item[\'category\']->slug . \'">
            <h2>\' . $list_item[\'category\']->name . \'</h2>\';

        foreach ($list_item[\'posts\'] as $post_html) :
          echo $post_html;
        endforeach;

        echo \'</div>\';

      endforeach;

      else : ?>

        <article id="post-not-found" class="hentry cf">
            <header class="article-header">
                <h1><?php _e( \'Sorry, No Results.\', \'boilerplate\' ); ?></h1>
            </header>
            <section class="entry-content">
                <p><?php _e( \'Try your search again.\', \'boilerplate\' ); ?></p>
            </section>
            <footer class="article-footer">
                    <p><?php _e( \'This is the error message in the search.php template.\', \'boilerplate\' ); ?></p>
            </footer>
        </article>

    <?php endif; ?>

        </main>

        <?php get_sidebar(); ?>

    </div>

</div>