¿Cómo agrupar resultados de búsqueda por tipo de entrada?
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( __( '← Entradas antiguas', 'FoundationPress' ) ); ?></div>
<div class="post-next"><?php previous_posts_link( __( 'Entradas nuevas →', 'FoundationPress' ) ); ?></div>
</nav>
<?php } ?>
<?php do_action('foundationPress_after_content'); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
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;
}
}

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

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
.

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

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.

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.

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

aquí está hecho de manera SQL.
