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 »', '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 »', '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!