Come ho delineato nell'introduzione a questa serie, il WP_Query
la classe ha quattro elementi principali:
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.
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 ()
.
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.
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 '
Questo controlla se la query ha recuperato qualsiasi messaggio e, in tal caso, apre il file ul
elemento e quindi esegue il ciclo.
È 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 '
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.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.
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.