Padronanza di WP_Query utilizzo del loop

Come ho delineato nell'introduzione a questa serie, il WP_Query la classe ha quattro elementi principali:

  • gli argomenti per la query, utilizzando i parametri che saranno trattati in dettaglio in questa serie
  • la query stessa
  • il ciclo, che produrrà il contenuto del post, i titoli o qualsiasi cosa tu voglia visualizzare
  • terminare: chiudere se e mentre tag e reimpostare i dati

In questo tutorial ti mostrerò come usare il loop con WP_Query, compresi i due modi principali per strutturare il loop e come utilizzare più loop.

Dove si adatta il loop

Senza un ciclo, nulla verrà visualizzato sulla tua pagina. Dopo che WordPress ha eseguito la query, utilizzando gli argomenti che hai definito, è necessario che gli venga detto cosa deve essere trasmesso dai dati che vengono recuperati. Questo è dove arriva il ciclo.

Quindi il ciclo arriva dopo la tua query e utilizza tre tag:

  • if ($ query-> have_posts ()) controlla se ci sono dei messaggi.
  • while ($ query-> have_posts ()) ripete il ciclo per ogni post finché ci sono post da recuperare.
  • $ Query-> the_post () accede a quel post specifico.

Quindi questo è dove il ciclo si inserisce nel WP_Query classe:

have_posts ()) // Inizia il ciclo sui risultati della query. while ($ query-> have_posts ()) $ query-> the_post (); // I contenuti dei risultati dei post interrogati vanno qui.  // Ripristina i dati del post originale. wp_reset_postdata (); ?>

Dopo aver eseguito il ciclo, tutto ciò che resta da fare è mettere in ordine le cose usando wp_reset_postdata ().

Struttura del ciclo

Il modo in cui il tuo ciclo è strutturato dipenderà dai dati che desideri visualizzare dal tuo post. Ecco un esempio di loop che emette il titolo del post, l'immagine in primo piano e un estratto. Dovresti usare un ciclo come questo in una pagina di archivio.

have_posts ()) // Inizia il ciclo sui risultati della query. while ($ query-> have_posts ()) $ query-> the_post (); ?> 
> "title =""> "title ="">

Questo ciclo mostra esattamente ciò che ho descritto sopra: l'immagine in primo piano, il titolo e l'estratto.

Prendendo il ciclo ulteriormente: Controllo del contenuto

Ma a volte potresti voler aggiungere un'intestazione prima del tuo elenco di post, o potresti volerli includere tutti in un elemento contenitore. Se hai semplicemente aggiunto questo prima del tuo ciclo, verrà emesso indipendentemente dal fatto che la query abbia effettivamente restituito tutti i dati, il che significa che potresti avere un'intestazione con niente al di sotto di essa, o qualche markup non necessario.

Questo è molto facile da aggirare mettendo l'elemento che racchiude o l'intestazione all'interno del tuo Se etichetta:

have_posts ()) echo '
'; eco '

'. __ ("Intestazione", "tutsplus"). '

'; // Inizia il ciclo sui risultati della query. while ($ query-> have_posts ()) $ query-> the_post (); ?>
> "title =""> "title ="">
'; // Ripristina i dati del post originale. wp_reset_postdata (); ?>

Qui puoi vedere che ho controllato se ci sono dei post recuperati dalla mia query, e se ci sono ho aperto un elemento contenente e aggiunto un'intestazione. 

Questo è utile anche se vuoi esportare i risultati della tua query come lista. Diciamo che voglio creare un elenco di tutti i messaggi in una determinata categoria. Il ul l'elemento non è all'interno del mio ciclo in quanto non si riferisce a un post specifico, ma voglio solo emetterlo se ci sono post. Quindi io uso questo:

 'category-slug', 'post_type' => 'post'); // Query personalizzata. $ query = new WP_Query ($ args); // Controlla che abbiamo i risultati delle query. if ($ query-> have_posts ()) echo '
    '; // Inizia il ciclo sui risultati della query. while ($ query-> have_posts ()) $ query-> the_post (); ?>
  • > "title ="">
  • '; // Ripristina i dati del post originale. wp_reset_postdata (); ?>

Questo controlla se la query ha recuperato qualsiasi messaggio e, in tal caso, apre il file ul elemento e quindi esegue il ciclo.

Esecuzione di loop extra

È importante essere consapevoli che mentre è possibile utilizzare WP_Query per eseguire più di un ciclo, è necessario ripristinare i dati del post e avviare una seconda istanza di WP_Query per fare questo. Questo perché ognuno dei tuoi loop produrrà dati basati su argomenti diversi.

Questo esempio mostra l'estratto e l'immagine in primo piano per il primo post e quindi solo il titolo di ogni post successivo:

 'post', 'posts_per_page' => '1'); // Prima query personalizzata. $ query1 = new WP_Query ($ args1); // Controlla che abbiamo i risultati delle query. if ($ query1-> have_posts ()) // Inizia il ciclo sui risultati della query. while ($ query1-> have_posts ()) $ query1-> the_post (); ?> 
> "title =""> "title ="">
'1', 'post_type' => 'post'); // Seconda query personalizzata. $ query2 = new WP_Query ($ args2); // Controlla che abbiamo i risultati delle query. if ($ query2-> have_posts ()) echo '
    '; // Inizia il ciclo sui risultati della query. while ($ query2-> have_posts ()) $ query2-> the_post (); ?>
  • > "title ="">
  • '; // Ripristina i dati del post originale. wp_reset_postdata (); ?>

Ho usato due argomenti chiave qui:

  • 'posts_per_page' => '1', utilizzato con la prima query, restituisce solo il post più recente.
  • 'offset' = '1', utilizzato con la seconda query, salta il primo post, assicurandosi che non venga ripetuto nell'elenco seguente.
  • Come puoi vedere dal codice sopra, il ciclo è leggermente diverso per ogni query. Il primo mostra l'immagine, il titolo e l'estratto in primo piano, mentre il secondo verifica se la query ha dei post e, in tal caso, apre a ul elemento e racchiude ciascun titolo del post in a Li elemento e un link alla sua pagina.

Noterai anche che l'ho usato wp_reset_postdata () dopo entrambi i cicli. Se non l'avessi fatto, il secondo ciclo avrebbe comunque emesso dati dal primo.

Sommario

Senza un ciclo, WP_Query in realtà non fa molto Il ciclo è il codice che utilizzi per visualizzare i dati che WordPress ha recuperato dal database in base agli argomenti della query.

Come ho dimostrato, ci sono alcune variazioni sul loop. Un semplice ciclo restituirà tutti i post nell'ordine specificato negli argomenti della query (o per data in ordine decrescente per impostazione predefinita). Se ti separi if ($ query-> have_posts ()) e while ($ query-> have_posts ()), è possibile inserire markup aggiuntivi al di fuori del ciclo, ma solo se la query ha restituito dati. E infine, specificando argomenti alternativi e usando wp_reset_postdata () dopo ogni ciclo, puoi usare WP_Query più di una volta per creare loop multipli sulla tua pagina.