Query personalizzate di WordPress: cicli multipli

Pubblicato: 2021-01-29

Nella maggior parte dei casi, quando crei un sito Web con WordPress, il tema che attivi visualizzerà per impostazione predefinita una prima pagina che elenca i tuoi post recenti, a meno che tu non scelga di visualizzare una pagina statica dalle opzioni di amministrazione in Impostazioni > Lettura. Ma cosa accadrebbe se volessi visualizzare una gamma diversa di contenuti che non fosse né una pagina statica né i tuoi ultimi post? Fortunatamente questo è possibile utilizzando WordPress Multiple Loops.

Vediamo come questo può essere realizzato!

Usa più loop sulla tua home page di WordPress

Prima di iniziare, vale la pena notare che dovresti apportare queste modifiche al tuo sito Web utilizzando un tema figlio poiché modificheremo i file modello del tuo tema. Se non lo fai, scoprirai che perderai tutte le modifiche apportate la prossima volta che aggiornerai il tema. Puoi scoprire di più sui temi per bambini qui.

Indipendentemente dal tema che stai utilizzando, il file PHP corrispondente per la home page includerà un ciclo standard che mostra alcuni post (nella maggior parte dei casi si tratta di post pubblicati di recente). Nel tema Twenty Twenty, ad esempio, troverai il codice che lo controlla all'interno del file index.php intorno alla riga 79.

 if ( have_posts() ) { $i = 0; while ( have_posts() ) { $i++; if ( $i > 1 ) { echo '<hr class="post-separator styled-separator is-style-wide section-inner" aria-hidden="true" />'; } the_post(); get_template_part( 'template-parts/content', get_post_type() ); } }

In un ciclo standard come questo, vengono utilizzate due importanti variabili globali:

  • $wp_query che è un oggetto della classe WP_Query e contiene un risultato della query del database WP
  • Il $post che è l'oggetto della classe WP_Post corrente.

Nella parte di codice sopra, controlliamo prima se ci sono post da mostrare con la funzione globale have_posts() e, in tal caso, scorrere questi post all'interno di un ciclo while. La funzione globale the_post() è quella che scorre i post dicendo a WordPress di passare al post successivo.

Se vuoi vedere queste funzioni e classi in dettaglio, puoi trovarle nel file wp-includes/class-wp-query.php .

Ai fini del nostro esempio abbiamo attivato il tema Twenty Twenty e quindi creato 6 Post in una categoria denominata "Categoria 1" e 5 Post di servizio in una categoria denominata "Servizi".

Per semplificare le cose, manterremo il codice del ciclo il più semplice possibile visualizzando solo un elenco dei titoli dei post.

 if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h3 class="entry-title">', '</h3>' ); } }

Ciò significa che nella nostra homepage vedremo qualcosa del genere:

Per iniziare Personalizzazione dell'output della nostra home page

Come abbiamo visto dallo screenshot qui sopra, se visitiamo la nostra "prima pagina" vedremo i 10 post più recenti indipendentemente dalle categorie che sono state loro assegnate.

Ora procederemo con la creazione del nostro modello di home page personalizzato in cui includeremo l'output personalizzato.

Per fare ciò, crea un file chiamato custom-homepage.php e salvalo nella cartella del tuo tema. Aggiungi il seguente codice a questa pagina:

 <?php /* * Template Name: My custom homepage template */ get_header(); if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h4 class="example"></h4>' ); } } get_footer();

Quindi, vai al tuo amministratore di WordPress e crea una pagina chiamata "La mia home page" e seleziona "Il mio modello di home page personalizzato" dal menu a discesa Modello come modello.

Quindi, per rendere questa la home page predefinita, dovrai selezionarla nel menu Impostazioni (Impostazioni > Lettura > Una pagina statica).

A questo punto, se dai un'occhiata alla tua Homepage dovresti vedere solo il titolo della pagina quando viene visualizzata dal front-end del tuo sito web.

Ora che abbiamo questa configurazione, aggiungiamo alcune query al nostro modello "Il mio modello di home page personalizzato".

Aggiunta di query personalizzate

Il nostro obiettivo in questo esempio sarà quello di visualizzare alcuni dei nostri ultimi post di tutte le categorie. Di seguito mostreremo i post di un tipo di post personalizzato chiamato "libri". Se non sai come impostare i tipi di post personalizzati, consulta l'articolo "Crea manualmente tipi di post personalizzati WordPress". L'inclusione di un tipo di post personalizzato è ovviamente del tutto facoltativo. Se non vuoi farlo, salta semplicemente i passaggi in cui ci riferiamo a questo tipo di post.

Iniziamo sostituendo il ciclo corrente (trovato in index.php intorno alla riga 79) con questo:

 $args = array( 'posts_per_page' => 8, 'orderby', 'date', 'order', 'DESC' ); $query = new WP_Query( $args ); while ( $query->have_posts() ) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Questo ciclo significa che la tua home page ora mostrerà i tuoi 8 post più recenti (come mostrato di seguito):

Quindi, se desideri includere il tipo di post personalizzato "libri" (o qualsiasi altro tipo di post personalizzato per quella materia), aggiungeremo un secondo ciclo per i post del libro proprio sotto il primo ciclo in questo modo:

 echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', 'posts_per_page' => 8 ); $query = new WP_Query( $args ); while ($query->have_posts()) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Vai al front-end del tuo sito Web e aggiorna la pagina per confermare che tutto funzioni come previsto.

Rompi una query personalizzata in parti

Può essere utile suddividere una query personalizzata in parti. Un motivo per farlo sarebbe se volessi "interrompere" la prima query mostrando i post di un'altra categoria o tipo di post prima di riprendere il ciclo iniziale. Questo è utile se, ad esempio, vuoi mostrare gli ultimi post di una categoria e poi mostrare altri contenuti prima di concludere finalmente con più "ultimi post" per terminare la pagina.

Entriamo in questo. Per iniziare, elimina il contenuto del file custom-homepage.php che abbiamo usato prima e aggiungi il codice qui sotto.

 <?php /* * Template Name: My custom homepage template */ get_header(); //////////// // Services Posts loop echo '<h4>Services</h4>'; $args = array( 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Books Posts in between echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', ); $books = new WP_Query( $args ); while ( $books->have_posts() ) : $books->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Resume Services Posts loop echo '<h4>More Services</h4>'; $args = array( 'offset' => '3', 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; //////////// get_footer();

Nel primo ciclo recuperiamo 3 post dalla categoria Servizi. Per riprendere i post della categoria Servizi nel terzo ciclo evitando duplicati, definiamo un offset => 3 . Ciò significherebbe che vedremmo quanto segue:

Ovviamente puoi modificare il valore di offset in qualsiasi numero desideri.

Aggiungi post personalizzati alla query sui post più recenti

E se volessimo includere i post del libro negli ultimi post della home page? Il ciclo predefinito non include per impostazione predefinita i post personalizzati. Ecco come possiamo risolvere questo problema.

Per questa sezione imposteremo le impostazioni di lettura per la home page su "I tuoi ultimi post".

Il percorso da seguire qui è l'uso pre_get_posts . Questo hook è introdotto nel file wp-includes/class-wp-query.php e viene utilizzato per personalizzare l'oggetto $query e il ciclo principale di WordPress come meglio credi. Viene eseguito dopo la creazione dell'oggetto variabile di query, ma prima dell'esecuzione della query effettiva.

Apri il file functions.php del tuo tema attivo e inserisci il seguente pezzo di codice alla fine:

 function homepage_add_cpt( $query ) { if ( $query->is_main_query() && is_home() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } add_action( 'pre_get_posts', 'homepage_add_cpt' );

Ciò che fa questo codice nella condizione if è assicurarsi che le modifiche vengano applicate nella home page solo mentre la query principale è in esecuzione.

Se ora visiti la tua home page, noterai che negli ultimi post sono inclusi anche i post personalizzati del "libro".

Conclusione

Praticamente senza eccezioni, tutto ciò che devi ottenere in termini di contenuti per la tua home page di WordPress è possibile. Come abbiamo mostrato qui, l'utilizzo di WordPress Multiple Loops è un modo efficace per personalizzare l'output che appare sulla tua home page. Il nostro approccio qui è solo uno dei tanti. WordPress offre incredibili livelli di controllo sull'output che appare sul tuo sito. Sperimenta con gli strumenti che forniscono per ottenere ciò che desideri!