Il WordPress Loop non è un semplice loop di programmazione, ma è quella parte di codice che viene utilizzato per visualizzare i contenuti principali e gli estratti di contenuti sui siti WordPress. Dovrebbe essere una delle prime cose da capire per uno sviluppatore WordPress, infatti Il WordPress Loop rappresenta una delle parti più importanti del sistema CMS e ci permette di personalizzare la visualizzazione dei nostri articoli e pagine all’interno dei nostri temi, ma non solo, viene usato anche per visualizzare post personalizzati e campi personalizzati.
Come funziona il WordPress Loop
Il WordPress Loop è un ciclo di interrogazione del database ed è in grado di presentare e/o modificare le informazioni ed i dati contenuti in esso.
Il loop inizia con il codice che controlla se la pagina corrente debba visualizzare un elenco di più post o un singolo post o pagina. Se la pagina dovesse elencare i post del blog, elencherà un titolo e un estratto (excerpt) per ogni post, è può tranquillamente essere personalizzato per visualizzare immagini in primo piano o altri contenuti. Se la pagina invece fosse una singola pagina o un singolo post, il loop visualizzerà solo il contenuto di quella pagina.
Se non esistono post disponibili o qualcuno accede a una pagina che non esiste, il loop ha un’opzione per visualizzare un messaggio personalizzato che informa il visitatore che non ci sono post o la pagina non esiste (simile a quello che fa una pagina 404 tranne che personalizzata per specifici tipi di contenuto).
Grazie ai templates di WordPress, il loop può essere personalizzato praticamente per ogni pagina o tipo di contenuto del tuo sito.
Esistono anche modi in cui è possibile utilizzare più loop su una stessa pagina per visualizzare diversi tipi di contenuto oppure formattare il contenuto in modi diversi. Ad esempio, è possibile avere l’ultimo post del blog con un’immagine in primo piano visualizzata più grande nella parte superiore del sito e di seguito avere i post più vecchi elencati di seguito con solo un titolo e un estratto.
WordPress Loop in pratica
Vediamo un semplice esempio di loop per visualizzare un elenco di post del blog:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2><?php the_title() ;?></h2>
<?php the_post_thumbnail(); ?>
<?php the_excerpt(); ?>
<?php endwhile; else: ?>
<p>Spiacenti, non abbiamo trovato posts da elencare.</p>
<?php endif; ?>
Andiamo ad analizzare riga per riga per capire al meglio il suo funzionamento:
- riga 1 – grazie al ciclo if controlliamo che la funzione have_posts() restituisca “true” ossia un valore booleano, di conseguenza la funzione esegue una veloce interrogazione al database e controlla se è presente almeno un post. Subito parte il bello del Loop! Praticamente stiamo dicendo a WordPress che fino a quando la funzione have_posts() restituisce un valore booleano “true”, all’interno di quella sessione, venga eseguita la funzione the_post() che ci permetterà di attivare gli strumenti che servono a mostrare i contenuti presenti all’interno del singolo post;
have_posts() e the_post() sono delle funzioni messe a disposizione da WordPress e se volete approfondire basta cercarle nel Codex di WordPress stesso. - riga 3/4/5 – all’interno del ciclo lanciato da while potremmo sbizzarrirci utilizzando gli strumenti che ci ha fornito la funzione the_post() personalizzando così la visualizzazione dei contenuti. In questo caso abbiamo inserito altre funzioni WordPress the_title(), the_post_thumbnail(), the_excerpt().
- dalla riga 6 in poi – chiudiamo il ciclo while e inseriamo un messaggio nel caso il controllo presente al rigo 1 avesse restituito un valore booleano “false”, ovvero se have_posts() non avesse trovato nessun articolo all’interno del database.
Se si usa il loop per visualizzare una pagina o un singolo post invece di elencarne più di uno, è interessante notare che non cambia di molto:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h1><?php the_title() ;?></h1>
<?php the_content(); ?>
<?php endwhile; else: ?>
<p>Spiacenti, la pagina non esiste.</p>
<?php endif; ?>
Notiamo che l’unica cosa che è veramente cambiata è l’introduzione della funzione the_content() che serve per visualizzare l’intero contenuto della pagina o singolo articolo.
In pratica la differenza la fa l’istruzione while (have_posts ()): the_post () che a seconda del template in cui viene utilizzato il loop e della pagina a cui si accede, determinerà quante volte ripetere il codice.
Cosa può visualizzare il loop
Ci sono una serie di elementi che il loop può visualizzare, come ad esempio il titolo, un estratto o il contenuto principale. Vediamo un elenco di queste funzioni comuni insieme a una breve descrizione e un collegamento a ulteriori informazioni su ciascuna funzione.
- next_post_link – collegamento al post pubblicato cronologicamente dopo il post corrente
- previous_post_link – collegamento al post pubblicato cronologicamente prima del post corrente
- the_category – Visualizza la categoria o le categorie associate al post o alla pagina visualizzata
- the_author – Visualizza l’autore del post o della pagina
- the_content – Visualizza il contenuto principale di un post o di una pagina
- the_excerpt – Visualizza le prime 55 parole del contenuto principale di un post, con un link […] oppure leggi altro che va al post completo. La lunghezza degli estratti può essere controllata utilizzando un filtro avanzato per questo metodo oppure utilizzando il campo Excerpt (in italiano in genere tradotto come “riassunto”) nella pagina di modifica del post.
- the_ID – Visualizza l’ID del post o della pagina
- the_meta – Utilizzato per visualizzare i campi personalizzati
- the_shortlink – Visualizza un collegamento alla pagina o al post utilizzando l’URL del sito che a sua volta utilizza l’ID del post o della pagina
- the_tags – Visualizza il tag o i tags associati al post
- the_title – Visualizza il titolo del post o della pagina
- the_time – Visualizza l’ora o la data del post o della pagina che può essere personalizzata utilizzando la formattazione della funzione di data php standard
Il loop può anche utilizzare delle istruzioni condizionali per visualizzare contenuto diverso in base a una serie di fattori.
- is_home () – Restituisce true se la pagina corrente è la home page
- is_admin () – Restituisce true se l’amministratore è connesso e visita il sito
- is_single () – Restituisce true se la pagina sta visualizzando un singolo post
- is_page () – Restituisce true se la pagina sta visualizzando una singola pagina
- is_page_template () – Può indicare se la pagina sta usando un modello specifico ad esempio: is_page_template(‘about-page.php’)
- is_category () – Restituisce true se la pagina o il post ha una categoria specificata ad esempio: is_category(‘news’);
- is_tag () – Restituisce true se la pagina o il post ha un tag specificato
- is_author () – Restituisce true se un autore specifico è connesso e visita il sito ad esempio: is_author(‘zagorthenay’)
- is_search – Restituisce true se la pagina è una pagina dei risultati di ricerca
- is_404 () – Restituisce vero se la pagina non esiste
- has_excerpt () – Restituisce vero se il post o la pagina ha un estratto
Puoi trovare un elenco completo di tutti i tag condizionali di WordPress sul codex WordPress
Esempio di loop avanzato
Ecco un esempio di un loop un po’ più complesso utilizzando delle funzioni ed istruzioni condizionali sopra descritte:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php if(is_category('featured')): ?>class="featured-post"<?php endif; ?>>
<h1><?php the_title() ;?></h1>
<p>
Pubblicato il <?php the_time('M j, Y'); ?>
da <?php the_category(', '); ?>
in <?php the_category(', '); ?>
</p>
<?php the_content(); ?>
<?php comment_form(); ?>
<div class="prev-next-links">
<ul>
<li><?php next_post_link(); ?></li>
<li><?php previous_post_link(); ?></li>
</ul>
</div>
</article>
<?php endwhile; else: ?>
<p>Spiacenti, questo articolo non esiste.</p>
<?php endif; ?>
Loop multipli
In alcune situazioni potrebbe essere necessario utilizzare più loop su una pagina. Per farlo è probabile che dovrai usare la funzione rewind_posts () prima e magari usarla una seconda, terza o quarta volta (puoi fare tutti i loop che vuoi su una pagina, ma attenzione ogni loop richiederà un’altra richiesta al database, quindi questo sicuramente rallenterà il tempo di caricamento delle tue pagine.
Ecco come appare la funzione rewind_posts() in azione per elencare i post del blog:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h1><?php the_title() ;?></h1>
<?php the_excerpt(); ?>
<?php endwhile; else: ?>
<p>Spiacenti, non ci sono posts da visualizzare.</p>
<?php endif; ?>
<?php rewind_posts(); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h1><?php the_title() ;?></h1>
<?php the_excerpt(); ?>
<?php endwhile; else: ?>
<p>Spiacenti, non ci sono posts da visualizzare.</p>
<?php endif; ?>
Però, con questo codice specifico, il problema è che ogni loop produrrà esattamente la stessa cosa. Per fare in modo che i due loop mostrino cose diverse, dovremo dare ai loop alcuni parametri in modo da indicare a ciascun loop esattamente ciò che vogliamo visualizzare.
Possiamo impostare i parametri per i cicli usando la funzione query_posts() che può fornire un gran numero di parametri tra cui scegliere per controllare quali post dovranno essere visualizzati da WordPress. Vedremo alcuni di questi in dettaglio nella prossima sezione, quindi diamo un’occhiata al codice necessario per visualizzare l’ultimo post in un formato e dopo elencare i prossimi tre post di seguito sotto.
<?php query_posts('showposts=1&post_type=post'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h1><?php the_title() ;?></h1>
<?php the_post_thumbnail(); ?>
<?php the_excerpt(); ?>
<?php endwhile; else: ?>
<p>Spiacenti, non ci sono posts da visualizzare.</p>
<?php endif; ?>
<hr>
<?php rewind_posts(); ?>
<?php query_posts('showposts=3&offset=1&post_type=post'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2><?php the_title() ;?></h2>
<?php the_excerpt(); ?>
<?php endwhile; else: ?>
<p>Spiacenti, non ci sono posts da visualizzare</p>
<?php endif; ?>
La funzione WP_Query
La funzione query_posts() usata nell’ultima sezione per impostare i parametri per impostare i parametri è parte di una classe (per chi conosce la programmazione ad oggetti) molto potente di WordPress chiamata WP_Query. Questa classe può essere utilizzata per creare loop WordPress molto specifici basati su un numero elevato di opzioni.
La funzione WP_Query viene inserita prima del ciclo. Un aspetto interessante di questa funzione è che tutto ciò che devi fare è posizionarlo prima del ciclo e non devi cambiare nulla sul ciclo stesso.
Ecco alcune delle opzioni WP_Query più comuni:
- author: filtra il ciclo in base all’ID dell’autore
- author_name – filtra l’autore in base a nome_utente
- cat – filtra il ciclo per ID categoria
- category_name – filtra il ciclo in base allo slug della categoria
- tag – filtra il ciclo per tag slug
- p – filtra il ciclo per pagina o ID articolo
- name – filtra il loop per post slug
- pagename – filtra il ciclo in base allo slug della pagina
- page_id – filtra il ciclo per pagina
- post_parent – filtra il ciclo in base all’ID della pagina principale
- post_type – filtra il loop per tipo di post, inclusi i tipi di post personalizzati
- posts_per_page – determina il numero di post nel loop
- offset: determina il numero di post di cui eseguire l’offset nel loop
- order: determina se i post vengono visualizzati in ordine crescente o decrescente
- orderby – filtra il fattore in base al quale vengono ordinati i post. L’impostazione predefinita è la data, ma può essere modificata per titolo o l’autore
- year: i filtri vengono ripetuti in base ai post in un determinato anno
- monthnum – Filtra il ciclo di un numero di mese ad esempio 1 = gennaio
- day: filtra il ciclo in base a un giorno specifico del mese
Di solito tutti i parametri vengono passati alla funzione WP_Query come un array.
Di seguito è riportato un esempio di utilizzo della funzione WP_Query per visualizzare il contenuto di una pagina specifica.
<?php
$args = array(
'pagename' => 'about-us'
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h1><?php the_title() ;?></h1>
<?php the_excerpt(); ?>
<?php endwhile; else: ?>
<p>Spiacenti, non ci sono posts da visualizzare.</p>
<?php endif; ?>
In un esempio più complesso, possiamo vedere come visualizzare tutti i post pubblicati da un autore specifico in un tipo di post personalizzato chiamato “workshop”. Viene filtrato anche il ciclo in modo che ordini i post in base al titolo e visualizzi solo i “workshop” pubblicati nell’anno 2019.
<?php
$args = array(
'author_name' => 'zgordon',
'orderby' => 'title',
'post_type' => 'workshops'
'year' => 2019
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h1><?php the_title() ;?></h1>
<?php the_excerpt(); ?>
<?php endwhile; else: ?>
<p>Spiacenti, non ci sono posts da visualizzare.</p>
<?php endif; ?>
Per approfondire le informazioni su come lavorare con WP_Query è sicuramente opportuno dare uno sguardo nel codex di WordPress.
Conclusione
Non è possibile creare un sito WordPress dinamico senza utilizzare il WordPress Loop, per altro il loop è una funzionalità di WordPress molto potente e, una volta capito, può anche essere notevolmente personalizzato utilizzando una gamma di tag, istruzioni condizionali e la funzione WP_Query.