¿Cómo agrupar resultados de búsqueda por tipo de entrada?

20 mar 2015, 18:08:34
Vistas: 14.8K
Votos: 9

Mi sitio tiene 3 tipos de entradas únicos:

  • Entradas de blog por defecto ("post")
  • Tipo personalizado "lesson" (lección)
  • Tipo personalizado "series" (serie)

Cuando el usuario busca en el sitio, me gustaría que los resultados pertinentes de los 3 tipos de entradas aparezcan en la página de resultados de búsqueda. Los resultados de "posts" en un contenedor, los de "lesson" en otro separado, etc. ¿Cómo puedo modificar la página de búsqueda para lograr esto?

Aquí está mi loop actual:

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

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

        <h2><?php _e('Resultados de búsqueda para', '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; Entradas antiguas', 'FoundationPress' ) ); ?></div>
            <div class="post-next"><?php previous_posts_link( __( 'Entradas nuevas &rarr;', 'FoundationPress' ) ); ?></div>
        </nav>
    <?php } ?>

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

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

<?php get_footer(); ?>
2
Comentarios

No uses elseif, utiliza solo if. De esta manera, todas las plantillas se mostrarán.

Ciprian Ciprian
20 mar 2015 18:52:38

No creo que if frente a elseif marque una diferencia en este caso.

s_ha_dum s_ha_dum
25 mar 2015 18:04:04
Todas las respuestas a la pregunta 1
8
21

Puedes ejecutar el mismo bucle múltiples veces usando rewind_posts() para mostrar cada tipo por separado.

if( have_posts() ){
    $types = array('post', 'lesson', 'series');
    foreach( $types as $type ){
        echo 'aquí abre tu contenedor para ' . $type;
        while( have_posts() ){
            the_post();
            if( $type == get_post_type() ){
                get_template_part('content', $type);
            }
        }
        rewind_posts();
        echo 'aquí cierra tu contenedor para ' . $type;
    }
}
20 mar 2015 20:54:48
Comentarios

Hola, el problema es que necesito almacenar cada tipo de publicación en su propio contenedor (estoy usando una interfaz con pestañas, así que si hacen clic en la pestaña "lección" obtienen todos los videos de "lección" que coincidan con su búsqueda, etc.). No estoy seguro de cómo adaptar tu método a eso

tdc tdc
21 mar 2015 03:01:27

Sí, eso es lo que asumí, y para eso es este ejemplo. Colocas el marcado de contenedor que quieras entre los bucles foreach y while.

Milo Milo
21 mar 2015 03:54:51

Ah, ya veo con la publicación editada, gracias. ¿Sabes si esto funcionará correctamente con la paginación también?

tdc tdc
23 mar 2015 15:55:46

esto solo ordenará las publicaciones por página, y la paginación funcionará igual que sin este código. Si el objetivo es ordenar las publicaciones juntas en todas las páginas, tendrás que modificar la consulta directamente con un filtro.

Milo Milo
23 mar 2015 17:36:40

Eso se acerca más a lo que estoy tratando de hacer. Básicamente, solo necesito una forma limpia para que las personas puedan ordenar los resultados de búsqueda por tipo de publicación. Idealmente, ni siquiera me molestaría con la paginación y simplemente haría que todos los resultados coincidentes se muestren en cada contenedor, pero no estoy seguro del impacto que podría tener en el rendimiento del sitio.

tdc tdc
23 mar 2015 17:41:19

entonces eso requerirá un filtro posts_orderby y algo de SQL personalizado. Desafortunadamente, no es algo que pueda escribir de memoria.

Milo Milo
23 mar 2015 18:02:43

aquí está hecho de manera SQL.

honk31 honk31
26 ago 2016 12:42:45

Eso es lo que estaba buscando, gracias. ¿Cómo agregar orderby a eso?

Mike Mike
22 may 2017 14:40:10
Mostrar los 3 comentarios restantes