Informatica: All’interno di WordPress

Dietro un gestore dei contenuti versatile e utilizzato da oltre 1 milione di utenti, si nasconde un’anima PHP + MySQL. Come è fatto il suo database? Come vengono eseguite le query? Ma soprattutto, cosa è WordPress?!

Il progetto WordPress

WordPress è un CMS (gestore dei contenuti) open source – dunque gratuito – sviluppato in PHP e MySQL. Per funzionare deve essere installato su un Web Server, che può essere parte di un piano di Hosting o su un computer proprio. Un esempio della prima situazione è WordPress.com, che fornisce una versione del software preinstallata sui loro server. Mentre la seconda è la possibilità di scaricarlo ed installarlo su un ambiente XAMPP o IIS. Quest’ultima è la soluzione migliore, poiché si ha pieno controllo del sito web ed una completa personalizzazione. Creato nel 2003 da Matt Mullenweg e Mike Little, è un fork del progetto b2/cafelog e viene rilasciato su licenza GPLv2 (e successive).

Il progetto WordPress su GitHub, piattaforma in cui la maggior parte degli utenti collaborano alla risoluzione dei bug e all’aggiunta di nuove funzionalità. Il progetto è aggiornato tramite SVN ogni 15 minuti.

WordPress è utilizzato da più di 60 milioni di siti web. Questo grazie alla sua versatilità e alla possibilità di aggiungere i cosiddetti plugin. C’è uno store pieno zeppo di add-on che permettono di trasformare una semplice piattaforma per la creazione di blog in un sito di e-commerce o una vera e propria web application come un gestionale ERP. Oltre ai plugin vi sono i temi, che garantiscono una piena personalizzazione del website anche secondo i parametri di Responsive Web Design: ovvero una tecnica per la realizzazione di siti web in grado di adattarsi in modo automatico al dispositivo con il quale vengono visualizzati (pc con monitor di diverse dimensioni, tablet, smartphone, web tv) e agli standard di accessibilità.

Come si usa WordPress

Il suo utilizzo è abbastanza semplice. E’ un CMS che soddisfa sia una ragazza di 25 anni che vuole aprire un blog di cucina che un esperto laureato in web design che vuole una soluzione veloce ma allo stesso tempo versatile e modificabile per un cliente dell’ultimo minuto. Chi vuole divertirsi può anche diventare un programmatore di plugin: bastano semplici conoscenze di PHP e MySQL e dell’ambiente in cui inserirsi. Il centro nevralgico del blog è il pannello di controllo, raggiungibile con un semplice /wp-admin dopo l’indirizzo del blog. Da qui partono tutti i post, le pagine, i media, le statistiche, i plugin, l’aspetto grafico, le impostazioni e gli utenti.

Il database di WordPress

WordPress è un gestore dei contenuti. Contenuti che devono essere memorizzati in un archivio. Questo archivio è un semplice database MySQL collegato al codice PHP di WP. Fondamentalmente, la struttura della base di dati è molto semplice. Togliendo eventuali plugin che possono aggiungere delle nuove tabelle, ci sono delle entità fondamentali su cui gira attorno tutto il CMS.

Entità e Relazioni Fondamentali

L’entità principale è l’articolo. Attorno ad esso gira tutta la struttura del database di WordPress. Ogni articolo viene inserito da un utente autorizzato, e cioè da un profilo abilitato all’inserimento dell’articolo. In genere possono pubblicare un post gli amministratori e gli editori, mentre gli autori possono solo salvare una bozza in attesa della pubblicazione dai primi due. Un’altra entità fondamentale è il commento, che può essere inserito da chiunque sul blog. In genere, la pubblicazione deve essere comunque autorizzata da un utente abilitato. Ogni post appartiene ad una Tassonomia e cioè un termine usato per raggruppare il post, in genere, per Categoria o per Tag. Gli utenti, sempre autorizzati, possono anche pubblicare delle semplici pagine web nel sito.

Entità secondarie

Vi sono altre entità strettamente legate a requisiti non funzionali di WordPress. Tra cui le opzioni, i metadati di sistema della tassonomia, degli utenti e dei post, i link del menu e le impostazioni di sistema.

Schema Logico

Ciò che salta subito all’occhio è la complessa relazione tra gli articoli e le tassonomie. WordPress raccoglie ogni termine di indicizzazione e lo inserisce in una tabella generale chiamata wp_terms. Queste parole divengono tassonomie e, associate all’articolo in una relazione N-N, possono essere categorie o tag. La tabella dei commenti ha come Foreign Key l’ID del post. Dunque, ogni commento è collegato ad un post. Come visto nell’E-R, gli utenti sono collegati ai commenti e ai post.

Query WordPress

Chi ha sviluppato siti in PHP e MySQL prima dell’avvento dei CMS Open Source, si ricorderà benissimo la funzione mysql_query() (oggi addirittura deprecata) che permetteva di inviare una query al database MySQL e salvare il risultato all’interno di una variabile per usarla successivamente all’interno della pagina.

La classe WP_Query

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().

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.

Loop in WordPress

Essendo un’applicazione, WordPress è in grado di generare 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 (connettendosi al database).

A cosa serve un loop personalizzato

Per dare una maggiore personalizzazione al blog, è utile fare delle query ad hoc con una maggiore restrizione. Ad esempio, se volessi creare una pagina contenente tutti gli articoli scritti il 1 Aprile perché magari creo sempre dei post divertenti in quel giorno, posso farlo. Dunque, vi è una maggiore selezione dei contenuti in base ai tanti parametri contenuti nelle tabelle del database.

Esempio di utilizzo della classe WP_Query

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 inviarlo al costruttore della classe e inizializzare l’oggetto.

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 $loopnon restituisce niente nella nostra pagina, ma questo perché dobbiamo ancora avviare il vero e proprio Loop.

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. Utilizziamo le funzionihave_posts() e the_post() ponendo di fronte l’istanza della classe appena creata assicurandoci che WordPress esegua il Loop che abbiamo appena creato. 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.

Conclusioni

WordPress è un CMS fantastico. Permette anche all’utente più esperto di manipolare i post a suo piacimento, semplicemente creando degli script PHP (che possono divenire anche plugin molto complessi). Dunque, non è banale fare di mestiere il “creatore di siti web su WordPress”, perché di lavoro da fare ce n’è davvero tanto se si vuole.

Francesco Grecucci

Mmh…c’è tanto da dire, ma non ti annoierò! Ho questo blog dal 2016 e studio all’ultimo anno di Informatica alle superiori a Taranto, in Puglia. Mi piacciono molto i vecchi computer, la fotografia e la musica. Ho anche scritto un libro, ma quella è un’altra storia…

Francesco Grecucci

Francesco Grecucci

Mmh...c'è tanto da dire, ma non ti annoierò! Ho questo blog dal 2016 e studio all'ultimo anno di Informatica alle superiori a Taranto, in Puglia. Mi piacciono molto i vecchi computer, la fotografia e la musica. Ho anche scritto un libro, ma quella è un'altra storia...