Oggi parliamo di una cosa che interessa qualsiasi sviluppatore WordPress, come creare dei Loop personalizzati che siano performanti out-of-the-box.
Non importa che il tuo interesse sia focalizzato nella creazione di temi o plugin, quello che ti voglio spiegare in questo articolo è molto importante perché scoprirai come utilizzare uno dei più potenti strumenti che questa piattaforma mette a disposizione e soprattutto come trarne il maggior beneficio.
Posso dire tranquillamente che WordPress basa la sua esistenza nella presenza di un Loop, un ciclo, che gli permette di andare a prendere e mostrare tutte le informazioni che sono contenute al suo interno.
Data la sua grande importanza, negli anni sono stati sviluppati diversi metodi che permettono la creazione o la personalizzazione di un Loop con il minimo sforzo dello sviluppatore. Funzioni come get_posts()
o query_posts()
sono state usate intensamente nel primo periodo, ma hanno sempre portato alcune difficoltà di comprensione.
Con la prima funzione, per esempio, è possibile richiedere un array contenente solo i post che abbiamo richiesto attraverso i suoi parametri mentre con la seconda andiamo a stravolgere il ciclo WordPress originale che viene svolto nella pagina ottenendo talvolta risultati inaspettati, soprattutto quando ci scordiamo di utilizzare la funzione wp_reset_query()
.
Aggiornarsi porta benefici
Se stai ancora utilizzando queste due soluzioni per creare il tuo Loop personalizzato ti consiglio di aggiornare le tue conoscenze e continuare a leggere. Puoi solo beneficiarne.
Per tua fortuna gli sviluppatori WordPress hanno creato un metodo sicuro ed efficace che ti permette di creare loop personalizzati sostituendo quello che viene eseguito naturalmente nella pagina, questa soluzione viene fornita dalla classe PHP WP_Query.
Se non conosci il termine classe, tutto quello che devi sapere al momento è che si tratta di un termine utilizzato nella programmazione ad oggetti e che racchiude al suo interno proprietà e metodi che permettono di personalizzare il comportamento standard del Loop WordPress, almeno in questo caso specifico.
Utilizzando questa classe ti accorgerai ben presto che tutto quello che fa è creare un oggetto che racchiuderà al suo interno tutte le informazioni necessarie a mostrare gli articoli selezionati dalla tua query.
Perché creare un Loop personalizzato?
Prima di passare al lato tecnico di questo articolo vorrei rispondere a un dubbio che probabilmente ti sei posto o che non ti sei mai chiesto nella tua cariera:
Perchè avrei la necessità di creare un Loop personalizzato?
Ti è mai capitato che il tuo cliente ti abbia chiesto di creare una pagina personalizzata all’interno della quale inserire soltanto i post che rispondono a una precisa condizione? Magari ti è stato chiesto di creare uno slider personalizzato che mostra in automatico gli ultimi 3 articoli pubblicati nella categoria “ciabatte”?
Forse questi esempi non sono stati così comprensibili perché non conosci ancora nel dettaglio il Loop WordPress. Nessun problema, se vuoi approfondire le tue conoscenze puoi leggere l’articolo introduttivo che ho pubblicato precedentemente, ma per gli scopi di questo tutto quello che devi sapere è che il Loop è la soluzione che WordPress ha implementato per gestire al meglio la gerarchia delle pagine.
Essendo un’applicazione, la nostra piattaforma WordPress è in grado di generare le pagine HTML che vengono richieste da un visitatore.
Che sia la homepage, un singolo articolo o la pagina prodotto del tuo eCommerce, WordPress sfrutta il suo Loop per costruire la struttura della pagina (grazie a specifici file PHP) e popolarla con il contenuto adeguato (connetendosi al database).
Questa soluzione è perfetta perché nella gran parte dei casi noi non ci dobbiamo neanche preoccupare di come WordPress crea queste pagine, il più delle volte il Loop che viene utilizzato risponde alle nostre necessità però da bravi sviluppatori sappiamo che talvolta capitano delle richieste che ci spingono a dover personalizzare questo comportamento.
È giunto il momento di conoscere WP_Query
Abbiamo visto che negli anni WordPress ha condiviso diverse funzioni che ci permettevano di creare Loop personalizzati, funzioni che per fortuna al giorno d’oggi pian piano vengono sempre più abbandonate e utilizzate soltanto nei casi d’uso specifici per i quali erano state create.
Utilizzare una classe PHP che genera un oggetto pronto da interrogare ci permette di fare molte cose interessanti, ma soprattutto ci permette di semplificare il nostro codice!
Ed è proprio di semplificazione che voglio parlare, inizializzare un oggetto WP_Query è semplice quanto dichiarare un array:
//Inizializzazione oggetto WP_Query $loop = new WP_Query( array( 'cat' => 3 ) );
La sintassi new WP_Query()
è quella che in PHP ci permette di inizializzare un oggetto della classe WP_Query, ma la cosa interessante sono i parametri che vengono passati al suo interno. Nell’esempio presentato sopra l’array di configurazione viene passato direttamente all’interno delle parentesi tonde, questo permetterà di passarlo direttamente al costruttore della classe e inizializzare l’oggetto.
Ho potuto fare una cosa del genere perché l’array precedente è molto semplice e il mio scopo era mostrarti come inizializzare l’oggetto, ma generalmente quando parliamo di WP_Query e configurazioni di Loop ci troviamo di fronte a una sintassi di questo tipo:
//Configurazione standard WP_Query $args = array( 'cat' => 3 ); $loop = new WP_Query( $args );
Come puoi notare tu stesso, separare la dichiarazione dell’array dall’inizializzazione dell’oggetto ci permette di organizzare molto meglio il nostro codice e di poter inserire tutte le opzioni che desideriamo all’interno dell’array.
Faccio riferimento a “tutte le opzioni che desideriamo” perché dando un veloce sguardo alla pagina del Codex dove viene descritta questa classe scopriremo che esistono decine di opzioni a nostra disposizione e che potremmo creare moltissime tipologie di Loop distinti.
Non corriamo troppo però, che cosa fa il codice che abbiamo appena inserito?
La dichiarazione dell’array $args
ci permette di dite a WP_Query che il nostro desiderio è quello di mostrare soltanto gli articoli che sono stati salvati all’interno della categoria con ID 3. Ovviamente l’inizializzazione dell’oggetto WP_Query all’interno della variabile $loop
non restituisce niente nella nostra pagina, ma questo perché dobbiamo ancora avviare il vero e proprio Loop.
La dichiarazione dell’array $args
ci permette di dite a WP_Query che il nostro desiderio è quello di mostrare soltanto gli articoli che sono stati salvati all’interno della categoria con ID 3. Ovviamente l’inizializzazione dell’oggetto WP_Query all’interno della variabile $loop
non restituisce niente nella nostra pagina, ma questo perché dobbiamo ancora avviare il vero e proprio Loop.
<?php //Apertura PHP inserita solo per colorazione sintassi //Array di configurazione Loop $args = array( 'cat' => 3 ); $loop = new WP_Query( $args ); if( $loop->have_posts() ) : while( $loop->have_posts() ) : $loop->the_post(); ?> <!-- Cosa fare dentro il loop --> <?php endwhile; else: ?> <!-- Cosa fare se il loop non trova niente --> <?php endif; wp_reset_query(); ?>
Come puoi notare tu stesso, la creazione di questo Loop è veramente molto semplice.
Si parte con la dichiarazione dell’array $args
nel quale inseriamo le specifiche per il loop da creare, successivamente si istanzia la classe WP_Query passando i parametri contenuti nell’array e in conclusione si procede con la creazione di un classico loop.
Al posto di utilizzare le funzioni have_posts()
e the_post()
come facciamo di consueto, in questo caso li utilizziamo ponendo di fronte l’istanza della classe appena creata assicurandoci che WordPress esegua il Loop che abbiamo appena creato. Ovvero non dobbiamo fare altro che utilizzarle come metodi assieme all’oggetto appena creato, seguendo l’esempio precedente potremmo scrivere $loop->have_posts()
oppure $loop->the_post()
.
Per il resto, una volta dentro al singolo articolo (indicato con il commento Cosa fare dentro il loop), potrai usare tranquillamente le funzioni che già conosci e che ti permettono di mostrare il contenuto di un articolo come the_title()
, the_content()
senza la necessità di specificare l’istanza $loop
.
Se sei stato attento, al termine del nostro Loop, proprio subito dopo la chiusura endif
, richiamo la funzione wp_reset_query()
che mi permette di dire a WordPress di dimenticarsi del ciclo appena eseguito e di ripristinare il Loop al suo valore originale. In questo modo, se nel seguito della nostra pagina abbiamo la necessità di utilizzare il ciclo originale, potremmo semplicemente eseguire il Loop utilizzando direttamente le funzioni have_posts()
e the_post()
senza il rischio di aver compromesso il corretto funzionamento della pagina stessa.
Crea Molteplici Loop
All’interno del corso Crea il tuo primo tema WordPress abbiamo scoperto quanto semplice sia utilizzare la classe WP_Query e l’abbiamo utilizzata per creare 3 differenti Loop incaricati di mostrare degli articoli appartenenti a delle categorie differenti, tutti nella stessa pagina.
Per fare questo tutto quello che dovrai fare è istanziare per tre volte questa classe e creare altrettanti cicli:
<?php //Apertura PHP inserita solo per colorazione sintassi //Creazione di 3 Loop nella stessa pagina $args = array( 'cat' => 3 ); $loop_cat1 = new WP_Query( $args ); if( $loop_cat1->have_posts() ) : while( $loop_cat1->have_posts() ) : $loop_cat1->the_post(); ?> <!-- Cosa fare dentro il loop --> <?php endwhile; else: ?> <!-- Cosa fare se il loop non trova niente --> <?php endif; wp_reset_query(); $args2 = array( 'cat' => 5 ); $loop_cat2 = new WP_Query( $args2 ); if( $loop_cat2->have_posts() ) : while( $loop_cat2->have_posts() ) : $loop_cat2->the_post(); ?> <!-- Cosa fare dentro il loop --> <?php endwhile; else: ?> <!-- Cosa fare se il loop non trova niente --> <?php endif; wp_reset_query(); $args3 = array( 'cat' => 11 ); $loop_cat3 = new WP_Query( $args3 ); if( $loop_cat3->have_posts() ) : while( $loop_cat3->have_posts() ) : $loop_cat3->the_post(); ?> <!-- Cosa fare dentro il loop --> <?php endwhile; else: ?> <!-- Cosa fare se il loop non trova niente --> <?php endif; wp_reset_query(); ?>
Ecco che, utilizzando semplicemente le conoscenze che già abbiamo, è possibile creare all’interno della stessa pagina un numero indefinito di cicli personalizzati, questo esempio sarebbe molto utile ad un tema in stile magazine!
Ovviamente il mio principale intento è quello di presentarti come creare dei Loop personalizzati nel modo più semplice possibile e infatti in questo articolo ti ho parlato soltanto della configurazione che ci permette di separare gli articoli in base alla categoria di salvataggio, ma un’istanza WP_Query può essere personalizzata in moltissimi modi, tutti indicati all’interno del Codex.
Non è mio interesse andare nel dettaglio e spiegarti uno per uno i parametri che potrai utilizzare, anche perché forse non ci basterebbe una intera giornata! Piuttosto vorrei farti riflettere un attimo sulle operazioni che vengono svolte e perché ti consiglio di utilizzare questa classe.
Bisogna tenere sempre in considerazione che ogni volta che usi WP_Query stai facendo delle operazioni con il database, in poche parole stai dicendo a WordPress qualcosa come:
“controlli se nel database esistono articoli nella categoria Scarpe? Se trovi qualcosa restituiscimi i primi X articoli.”
oppure
“Ci sono articoli pubblicati dopo il 10 Febbraio che sono stati scritti da Pippo?“.
Ciascuna di queste operazioni utilizza molte risorse del tuo server, risorse che rallentano il caricamento del tuo sito web, quindi pensa bene a quante query avrà bisogno il tuo progetto e a quali soluzioni potresti usare per migliorare le prestazioni del tuo server.
La cosa bella è che utilizzando questa classe, a differenza delle funzioni presentate a inizio articolo, utilizzi la corretta sintassi che lo stesso WordPress usa per creare i propri cicli e questo significa che se installi un plugin che ottimizza le prestazioni del tuo server, come ad esempio un qualsiasi plugin per gestire la cache, sarà in grado di ottimizzare anche il tuo codice.
Questo non sarà possibile se utilizzi delle query MySQL o altre soluzioni più datate perché non rispetteranno gli standard di questa piattaforma e per essere in grado di ottimizzare le funzionalità aggiunte dovrai scrivere altro codice custom.
Conclusioni
Saper utilizzare correttamente la WP_Query è una cosa che richiede molta pratica e non puoi basarti sulla lettura di un singolo articolo. Non ti scoraggiare se con i primi esperimenti trovi difficoltà o ottieni dei risultati inaspettati, questa classe è davvero molto potente e posso assicurarti che da quando l’ho conosciuta non ho più smesso di usarla.
Spero che questo articolo sia stato utile e ti invito a restare in contatto iscrivendoti alla newsletter e a condividere questo articolo con i tuoi contatti, non avrai niente da perdere tanto è gratis!
Se invece sei pronto ad investire in te stesso ed accedere a decine di ore di contenuto avanzato puoi abbonarti adesso.
Lascia un commento