Comprendi MySQL in WordPress

Comprendere MySQL in WordPress

Molti sviluppatori WordPress non si sono mai trovati di fronte a del codice SQL e sembra proprio che la nostra piattaforma preferita ci tenga "a distanza" da questi tipi di query. Ma ti sei mai accorto che quella che stai utilizzando è una piattaforma che basa la sua esistenza su questo database?!?

Capita molto spesso di utilizzare le funzioni WordPress per creare tutto quello di cui abbiamo bisogno. Alcune volte utilizziamo delle funzioni che ci permettono di prendere il titolo di un articolo o di una pagina, altre funzioni ci sono utili per inserire delle classi all’interno dei nostri elementi, mentre altre ci permettono di personalizzare il Loop WordPress e di adattarlo alle nostre necessità.

Ma ti sei mai chiesto come è possibile svolgere questi compiti?

In questo articolo non voglio tanto introdurti alla sintassi MySQL, dato che sono stati scritti anche diversi libri a riguardo, ma piuttosto voglio farti una presentazione di come WordPress utilizza questo database e alcune operazioni che ti permetteranno di velocizzare il tuo sito!

Conoscere il funzionamento di un database e sopratutto come WordPress lo utilizza ti permetterà di prendere delle scelte più appropriate e ti faciliterà il compito di ottimizzazione del tuo codice. Anche se i consigli che seguiranno saranno più utili se stai sviluppando un sito di grosse dimensioni o che deve servire un gran numero di utenti, ti consiglio caldamente di continuare a leggere perché le nozioni racchiuse all’interno di questo articolo ti accompagneranno in tutta la tua carriera!

Che cosa è un DataBase?

Se leggi wpAndMore da diverso tempo dovresti anche sapere che non sono un fan delle definizioni accademiche, per quanto precise e necessarie le trovo veramente noiose! Se ti interessa la definizione più approfondita, ti consiglio di andare a leggere la definizione che trovi su Wikipedia, se sei restato a leggere sappi che (dal mio punto di vista) un database non è altro che un magazzino in grado di contenere tutte le informazioni che riguardano il tuo sito WordPress.

E quando scrivo tutte, intendo proprio tutte!

Cosa è un Database

Al suo interno verranno salvate informazioni come il titolo del blog, il suo motto, gli articoli, i commenti, le pagine senza dimenticarci che, come per ogni magazzino che si rispetti, aggiungerà anche i dettagli che ti permetteranno di conoscere lo scaffale ed il corridoio di ogni singolo elemento. Già da questo piccolo esempio puoi capire quante informazioni vengono mantenute all’interno di un singolo database.

Ma il database non è un’entità unica che vive all’interno di un server web, un database può essere personalizzato ed organizzato come meglio si crede, sopratutto per migliorare le prestazioni del sito, ed in questo articolo voglio mostrarti e farti capire come WordPress gestisce questo elemento.

Prima di fare questo passo è necessario che tu sappia che il database MySQL può essere scomposto in diverse tabelle. Le tabelle servono a definire delle aree particolari all’interno delle quali si desidera salvare un determinato contenuto. Facciamo un esempio dal vivo, poco fa ti ho detto che WordPress è in grado di salvare un gran numero di informazioni, tra i primi elementi che dicevo erano presenti gli articoli.

Come ben sai, ogni articolo ha diverse sezioni come: titolo, corpo, categorie, tag e qualsiasi altro campo che il tuo tema o i plugin installati ti permettono di aggiungere. Quando premi per la prima volta il bottone salva WordPress andrà a salvare alcune informazioni all’interno della tabella wp_posts mentre altre verranno salvate all’interno di wp_postmeta.

Prima ancora di scoprire quali informazioni verranno salvate dove devi capire che queste vengono organizzate all’interno delle tabelle con, indovina un pò, colonne e righe. Quindi, proprio come una qualsiasi altra tabella le colonne serviranno per definire il tipo di informazione contenuta mentre le righe collezioneranno tutte le informazioni riguardanti lo stesso articolo.

Introduzione alle Tabelle WordPress

Quindi abbiamo appena scoperto che i database possono contenere al loro interno diverse tabelle, come le sue simili, organizzano le informazioni grazie all’aiuto di righe e colonne. Qua sotto puoi vedere una piccola porzione della tabella wp_posts e subito dopo ti spiego come è organizzato l’intero database WordPress.

Ecco il Contenuto della Tabella wp_posts

Con l’aiuto di questa immagine dovrebbe essere più semplice riuscire a visualizzare i concetti che ti ho presentato. Per ogni colonna c’è un tipo di informazione contenuta (il contenuto dell’articolo, l’autore del post, il titolo e molto altro) mentre una riga identifica un unico elemento inserito all’interno del database.

Ma Quante Tabelle ha WordPress?

Se devo essere sincero, la struttura del database non è molto complessa, infatti potremmo trovare uno schema di questo tipo:

  • Articoli (wp_posts), Commenti (wp_comments), Utenti (wp_users) – che permettono di gestire le informazioni base di questi elementi (maggiori informazioni a breve);
  • Meta Articoli (wp_postmeta), Meta Commenti (wp_commentmeta), Meta Utenti (wp_usermeta) – che contengono tutte le informazioni aggiuntive di questi elementi;
  • Opzioni (wp_options) – che ti permetterà di salvare le informazioni relative ai tuoi plugin e temi;
  • Link (wp_links) – che viene usata sempre meno;
  • Tassionomie (wp_terms,wp_term_taxonomy, wp_term_relationship) – in queste tabelle vengono contenute tutte le informazioni relative a categorie, tag e tassionomie personalizzate.

Come puoi vedere, con solo 10 tabelle WordPress è in grado di funzionare offrendo già un gran numero di servizi! È giunto però il momento di scoprire qualcosa in più su queste tabelle…

All’interno della tabella wp_posts vengono contenute tutte le informazioni di Articoli, Pagine e Custom Post Type; queste includono il titolo, il testo completo, il suo riassunto ed alcune informazioni riguardo l’autore e la data di pubblicazione (ad essere sincero ce ne sono molte altre, ma escono dagli scopi di questo articolo). La tabella wp_postmeta, invece, è un tipo di tabella che elenca soltanto una serie di chiave/valore e permette di inserire tutte le informazioni aggiuntive che desideri.

In modo molto simile funzionano le tabelle wp_comments e wp_commentmeta, la prima salva le informazioni più importanti mentre la seconda è organizzata con una serie di chiave/valore che anchesse contengono elementi diversi di un commento.

Questo ci porta a scoprire la tabella wp_users, che contiene informazioni riguardanti gli utenti della tua installazione WordPress come ad esempio l’indirizzo email, la stringa da usare come nome utente, lo slug del nome e molto altro; wp_usermeta, invece, è creata ad immagine e somiglianza delle precedenti meta tabelle. Un insieme di informazioni aggiuntive riguardanti, in questo caso, gli utenti.

Dato che wp_options è simile a wp_postmeta e wp_links è una tabella che probabilmente scomparirà nelle prossime versioni di WordPress non ci resta che parlare delle tabelle che definiscono le nostre tassionomie.

Ad un primo sguardo queste tabelle sono un vero macello e bisogna dire che gli sviluppatori WordPress hanno fatto veramente un ottimo lavoro nel fornirci una serie di API che ci permettessero di poter lavorare con le informazioni contenute al loro interno.

Come Fare una Query MySQL in WordPress

Dai metodi che andremo a vedere a breve, molto probabilmente non andrai mai ad utilizzare queste funzioni (anche perché probabilmente non conosci la sintassi SQL), ma da un punto di vista didattico ritengo che sia utile sapere almeno che esistono. 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 futuri usi.

Bene, che tu ti ricordi o meno la presenza di questa funzione, il mio intento era soltanto quello di farti capire che con il linguaggio PHP abbiamo alcune funzioni che permettono di collegarsi al database mentre con WordPress ne abbiamo altre. Le prime che mi vengono in mente sono:

  • $wpdb->get_var(); – grazie al metodo get_var() è possibile inserire una query SQL, selezionare la colonna e la riga interessata per ottenere il valore cercato;
  • $wpdb->get_row() con questa sarà invece possibile selezionare una intera riga. Ad esempio, potresti avere l’id di un utente e utilizzare questo metodo per andare a prendere delle informazioni presenti nella sua riga;
  • $wpdb->get_col() invece di una riga, con questo puoi usare la tua SQL per selezionare soltanto una colonna.

Ovviamente nella pagina del Codex troverai moltre altre funzioni utili e magari anche più adatte ai tuoi scopi ma siamo qua per capire come WordPress può essere di nostro aiuto sopratutto se non abbiamo a disposizione grandi conoscenze MySQL.

L’Aiuto delle Classi WP_*

Abbiamo già visto qualche settimana fa la classe WP_Query, un ottimo metodo per creare dei Loop personalizzati che ci permettono anche di specificare nel dettaglio il tipo di risultato che desideriamo ottenere. Una tra le cose che non ho rilevato al momento, anche perché non interessava direttamente l’argomento trattato, è che le operazioni che eseguiamo con questa classe vengono svolte direttamente con il database.

Questo significa che ogni Loop non è altro che una query MySQL generata automaticamente dalla piattaforma WordPress.

Sicuramente le query generate da uno sviluppatore esperto saranno più ottimizzate rispetto a quelle generate da una macchia (infatti IMHO una macchina non può battere un essere umano in creatività) ma sicuramente questo rappresenta un vantaggio per tutti noi piccoli sviluppatori che si trovano a lavorare con clienti che richiedono sempre di più ma sono disposti a spendere sempre meno.

La cosa bella che proviene da tutto questo è che se unisci la semplicità di generazione di queste query con la possibilità di inserirle nella cache del tuo WordPress attraverso le API che ci mette a disposizione siamo già a cavallo nella ottimizzazione del nostro sistema.

Una cache è un sistema installato all’interno del proprio server che ti permette di salvare in memoria determinate informazioni che altrimenti sarebbero più lente da eseguire all’interno di un database; proprio come succede con Loop particolarmente complessi.

Con questo non ti sto consigliando di utilizzare soltanto questi sistemi, perché in informatica niente si fa per caso, ti sto soltanto mostrando come sia possibile ottimizzare le query generate automaticamente da WordPress.

Ma mi sono divulgato anche un pò troppo e non ho ancora presentato le altre classi:

  • WP_User_Query – classe creata con lo scopo di rendere più semplice la realizzazione di query MySQL che ci permettessero di indagare all’interno delle tabelle wp_users e wp_usermeta;
  • WP_Comment_Query – altra classe specializzata nella creazione di query MySQL relative ai commenti ricevuti in un blog.

Come puoi vedere WordPress ha pensato un pò a tutto e grazie alle cache sarai in grado di ottimizzare il tuo lavoro.

Conclusioni

In questo articolo, ispirato dall’ottimo e più tecnico articolo di Scott Taylor, ti ho voluto presentare il database MySQL e come WordPress lo utilizza. Sono cosciente che non ci sono molte informazioni pratiche ma di tanto in tanto è necessario fare qualche piccola pausa per fare un pò di teoria e cercare di capire che cosa sia meglio utilizzare al momento perché, se il tuo sito genera decine di migliaia di visite al giorno e hai delle query molto complesse da eseguire (magari perché WordPress non è in grado di generare una query più ottimizzata) non esiste un sistema di cache che potrà salvarti dai rallentamenti di caricamento!

Dovrai quindi imparare come creare delle query MySQL o come fare per ottimizzarle ma, il mio consiglio personale, è chiamare un professionista e continuare a fare quello che sai fare meglio, lavorare con WordPress. In fin dei conti queste situazioni sono veramente rare e saranno altrettante le occasioni per cui ti dovrai rivolgere ad un professionista.

Chiudo qua questo articolo ma prima volevo farti una veloce domanda: Ti è mai capitato di dover Ottimizzare le query MySQL? Oppure ti è bastato far leva sulla cache?

Se la tua risposta alla seconda domanda è affermativa, mi interesserebbe sapere se hai sviluppato un sistema di cache tutto tuo o se ti sei appoggiato ad uno dei plugin che si trovano nel repository WordPress.

 

Lascia il tuo Pensiero

7 Responses to “Comprendere MySQL in WordPress”

    • andrea

      ciao
      bell’articolo,io avrei una domanda, sul mio sito utilizzo anche woocommerce e vorrei poter esportare le anagrafiche articoli, ho trovato quasi tutto tranne le immagini ovvero pensavo fossero nella wp_postmeta ma non risultano collegate usando il post id o il meta id, hai qlke suggerimento perchè al momento sono fermo e nn so cos’altro fare, ho spulciato tutti i record con le varie meta_key ma nulla…
      grazie

      Rispondi
      • Andrea Barghigiani

        Ciao Andrea,
        in tutta onestà quello che mi stai dicendo esce un po’ dalle mie conoscenze perché non sono un grande appassionato di WooCommerce. Cmq sia girando un po’ in rete ho trovato questo articolo che mi sembra dia qualche dritta a riguardo.
        Purtroppo non posso esserti di estremo aiuto perché non sono un grande utilizzatore di query MySQL. Hai mica provato ad utilizzare WP_Query?

        Rispondi
  1. maurizio

    Ciao, volevo sapere se posso svuotare le tabelle dei commenti (quali sono) dal pannello di controllo di MySql perchè sono talmente tanti che nn posso più cancellarli dall’amministrazione di wp. Non vorrei fare danni. Grazie mille della risposta

    Rispondi
    • Daniele Scasciafratte

      Non te lo consiglio, rischi di fare danni e far saltare i riferimenti interni di wordpress. Imposta come visualizzazione su wordpress in impostazioni schermata tipo 100 elementi così con un colpo solo puoi cancellarne un centinaio.

      Rispondi