Come raggruppare i risultati di ricerca per tipo di post?
Il mio sito ha 3 tipologie di contenuti uniche:
- Articoli del blog predefiniti ("post")
- Tipo personalizzato "lesson" (lezione)
- Tipo personalizzato "series" (serie)
Quando un utente cerca nel sito, vorrei che i risultati pertinenti di tutte e 3 le tipologie apparissero nella pagina dei risultati di ricerca. I risultati degli "articoli" in un contenitore, quelli delle "lezioni" in un altro separato, ecc. Come posso modificare la pagina di ricerca per ottenere questo risultato?
Ecco il mio loop attuale:
<?php get_header(); ?>
<div class="row">
<div class="small-12 large-8 columns" role="main">
<?php do_action('foundationPress_before_content'); ?>
<h2><?php _e('Risultati della ricerca per', '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( __( '← Articoli precedenti', 'FoundationPress' ) ); ?></div>
<div class="post-next"><?php previous_posts_link( __( 'Articoli successivi →', 'FoundationPress' ) ); ?></div>
</nav>
<?php } ?>
<?php do_action('foundationPress_after_content'); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Puoi eseguire lo stesso loop più volte utilizzando rewind_posts()
per visualizzare ogni tipologia separatamente.
if( have_posts() ){
$types = array('post', 'lesson', 'series');
foreach( $types as $type ){
echo 'qui si apre il tuo contenitore per ' . $type;
while( have_posts() ){
the_post();
if( $type == get_post_type() ){
get_template_part('content', $type);
}
}
rewind_posts();
echo 'qui si chiude il tuo contenitore per ' . $type;
}
}

Ciao -- il problema è che devo memorizzare ogni tipo di post nel suo contenitore (sto usando un'interfaccia a schede, quindi se cliccano sulla scheda "lezione" ottengono tutti i video di "lezione" che corrispondono alla loro ricerca, ecc.) Non sono sicuro di come adattare il tuo metodo a questo

sì, è quello che immaginavo, e questo esempio serve proprio a quello. metti il markup del contenitore che preferisci tra i cicli foreach
e while
.

Ah capisco con il post modificato, grazie. Sai se funzionerà correttamente anche con l'impaginazione?

questo ordinerà i post solo su base per-pagina, e la paginazione funzionerà allo stesso modo che senza questo codice. se l'obiettivo è ordinare i post insieme attraverso tutte le pagine, dovrai modificare la query direttamente con un filtro.

Questo è più in linea con quello che sto cercando di fare. Fondamentalmente ho solo bisogno di un modo pulito per permettere alle persone di ordinare i risultati di ricerca per tipo di post. Optimalmente non mi preoccuperei nemmeno della paginazione e farei semplicemente visualizzare tutti i risultati corrispondenti in ogni contenitore, ma non sono sicuro di quale impatto potrebbe avere sulle prestazioni del sito

allora sarà necessario un filtro posts_orderby
e un po' di SQL personalizzato. purtroppo non è qualcosa che potrei scrivere al volo.

qui è stato fatto in modo SQL.
