Come raggruppare i risultati di ricerca per tipo di post?

20 mar 2015, 18:08:34
Visualizzazioni: 14.8K
Voti: 9

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( __( '&larr; Articoli precedenti', 'FoundationPress' ) ); ?></div>
            <div class="post-next"><?php previous_posts_link( __( 'Articoli successivi &rarr;', 'FoundationPress' ) ); ?></div>
        </nav>
    <?php } ?>

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

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

<?php get_footer(); ?>
2
Commenti

Non usare elseif, usa solo if. In questo modo, tutti i template verranno visualizzati.

Ciprian Ciprian
20 mar 2015 18:52:38

Non credo che if vs elseif faccia differenza in questo caso.

s_ha_dum s_ha_dum
25 mar 2015 18:04:04
Tutte le risposte alla domanda 1
8
21

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;
    }
}
20 mar 2015 20:54:48
Commenti

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

tdc tdc
21 mar 2015 03:01:27

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

Milo Milo
21 mar 2015 03:54:51

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

tdc tdc
23 mar 2015 15:55:46

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.

Milo Milo
23 mar 2015 17:36:40

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

tdc tdc
23 mar 2015 17:41:19

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

Milo Milo
23 mar 2015 18:02:43

qui è stato fatto in modo SQL.

honk31 honk31
26 ago 2016 12:42:45

È esattamente quello che stavo cercando, grazie. Come posso aggiungere orderby a questo?

Mike Mike
22 mag 2017 14:40:10
Mostra i restanti 3 commenti