0

For a client I need to group results on the search results page by category. In this case it would not be posts, but pages that have inherited categories form posts with the Add Tags And Category To Page And Post Types plugin.

This is the non-edited search results page template:

    <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>

And this is how I got so far with a little help:

<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>

The problem here is that all pages are being listed that have a category, not just the search results that have a category. It looks like the loop is missing some kind of search-query parameter. I would like to know how I can improve the page template so it shows the search results by category. Maybe there is a much easier way than what I posted above?

Thanks in advance!

1

Add in the search parameter to your query:

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

And above that you should just be able to grab the keyword right from your querystring like so:

$keyword = $_GET['s'];

There's also a WordPress native function that grabs your current search query which might be better to use than grabbing it manually from the querystring:

$keyword = get_search_query();
0

Unfortunately it does not solve my problem yet. When I search for something that I am sure of is on the site, I simply get nothing. When there are no search results, the 'No results' message shows up as expected.

I just can't imagine that I am the only one with this question, but there is so little to find about it.

This is my code now: `

    <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>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.