loop - group search results by post type?

admin2025-06-04  1

My site has 3 unique post types:

  • Default Blog posts ("post")
  • custom type "lesson"
  • custom type "series"

When the user searches the site, I would like pertinent results from all 3 post types to show up on the search results page. The "posts" results are in one container, "lesson" results in a separate container, etc. How can I modify the search page to accomplish this?

Here is my current loop:

<?php get_header(); ?>
<div class="row">
    <div class="small-12 large-8 columns" role="main">

        <?php do_action('foundationPress_before_content'); ?>

        <h2><?php _e('Search Results for', 'FoundationPress'); ?> "<?php echo get_search_query(); ?>"</h2>

    <?php if ( have_posts() ) : ?>

        <?php while ( have_posts() ) : the_post(); ?>
            <?php if( get_post_type() == 'lesson' ) {
                    get_template_part('content', 'lesson');
                } else if ( get_post_type() == 'post' ) {
                    get_template_part('content', get_post_format());
                }
            ?>
        <?php endwhile; ?>

        <?php else : ?>
            <?php get_template_part( 'content', 'none' ); ?>

    <?php endif;?>

    <?php do_action('foundationPress_before_pagination'); ?>

    <?php if ( function_exists('FoundationPress_pagination') ) { FoundationPress_pagination(); } else if ( is_paged() ) { ?>

        <nav id="post-nav">
            <div class="post-previous"><?php next_posts_link( __( '&larr; Older posts', 'FoundationPress' ) ); ?></div>
            <div class="post-next"><?php previous_posts_link( __( 'Newer posts &rarr;', 'FoundationPress' ) ); ?></div>
        </nav>
    <?php } ?>

    <?php do_action('foundationPress_after_content'); ?>

    </div>
    <?php get_sidebar(); ?>

<?php get_footer(); ?>

My site has 3 unique post types:

  • Default Blog posts ("post")
  • custom type "lesson"
  • custom type "series"

When the user searches the site, I would like pertinent results from all 3 post types to show up on the search results page. The "posts" results are in one container, "lesson" results in a separate container, etc. How can I modify the search page to accomplish this?

Here is my current loop:

<?php get_header(); ?>
<div class="row">
    <div class="small-12 large-8 columns" role="main">

        <?php do_action('foundationPress_before_content'); ?>

        <h2><?php _e('Search Results for', 'FoundationPress'); ?> "<?php echo get_search_query(); ?>"</h2>

    <?php if ( have_posts() ) : ?>

        <?php while ( have_posts() ) : the_post(); ?>
            <?php if( get_post_type() == 'lesson' ) {
                    get_template_part('content', 'lesson');
                } else if ( get_post_type() == 'post' ) {
                    get_template_part('content', get_post_format());
                }
            ?>
        <?php endwhile; ?>

        <?php else : ?>
            <?php get_template_part( 'content', 'none' ); ?>

    <?php endif;?>

    <?php do_action('foundationPress_before_pagination'); ?>

    <?php if ( function_exists('FoundationPress_pagination') ) { FoundationPress_pagination(); } else if ( is_paged() ) { ?>

        <nav id="post-nav">
            <div class="post-previous"><?php next_posts_link( __( '&larr; Older posts', 'FoundationPress' ) ); ?></div>
            <div class="post-next"><?php previous_posts_link( __( 'Newer posts &rarr;', 'FoundationPress' ) ); ?></div>
        </nav>
    <?php } ?>

    <?php do_action('foundationPress_after_content'); ?>

    </div>
    <?php get_sidebar(); ?>

<?php get_footer(); ?>
Share Improve this question asked Mar 20, 2015 at 16:08 tdctdc 2711 gold badge3 silver badges12 bronze badges 2
  • Don't use elseif, use only if. This way, all the templates will be displayed. – Ciprian Commented Mar 20, 2015 at 16:52
  • I don't think if vs. elseif will make a difference here. – s_ha_dum Commented Mar 25, 2015 at 16:04
Add a comment  | 

1 Answer 1

Reset to default 21

You can run the same loop multiple times by using rewind_posts() to output each type separately.

if( have_posts() ){
    $types = array('post', 'lesson', 'series');
    foreach( $types as $type ){
        echo 'your container opens here for ' . $type;
        while( have_posts() ){
            the_post();
            if( $type == get_post_type() ){
                get_template_part('content', $type);
            }
        }
        rewind_posts();
        echo 'your container closes here for ' . $type;
    }
}
转载请注明原文地址:http://conceptsofalgorithm.com/Algorithm/1749045577a315890.html

最新回复(0)