Oggi daremo un’occhiata alla tabella wp_options del database di WordPress. Si tratta di un argomento che spesso viene trascurato quando si parla di prestazioni generali di WordPress e del database. Soprattutto in siti più vecchi e di grandi dimensioni, questa tabella può essere la causa di tempi di interrogazione lenti causati da dati caricati automaticamente da plugin e temi di terze parti. Dai uno sguardo ai seguenti suggerimenti su come verificare, risolvere i problemi e ripulire la tua tabella wp_options.

Cos’è la tabella wp_options?

La tabella wp_options contiene ogni sorta di dati utili al tuo sito WordPress, tra cui:

  • URL del sito, URL della home, email di amministrazione, categoria predefinita, numero di post per pagina, formato dell’ora, ecc.
  • Impostazioni per plugin, temi, widget
  • Dati memorizzati nella cache temporaneamente
Tabella wp_options
Tabella wp_options

La tabella contiene i seguenti campi, uno dei quali ci interessa più degli altri quando si tratta di prestazioni:

  • option_id
  • option_name
  • option_value
  • autoload
autoload nella tabella wp_options
autoload nella tabella wp_options

Una delle cose più importanti da capire sulla tabella wp_options riguarda il campo autoload. Questo campo contiene un valore “yes” o “no” (flag). Questo essenzialmente controlla se è caricato o meno dalla funzione wp_load_alloptions(). I dati caricati automaticamente sono dati che vengono caricati su ogni pagina del tuo sito WordPress. Qui si applica la stessa metodologia che ti abbiamo illustrato per disabilitare certi script dal caricamento in tutto il sito. L’attributo autoload è impostato su “yes” di default per gli sviluppatori, ma in teoria non tutti i plugin dovrebbero caricare i loro dati in tutte le pagina.

Il problema in cui possono incorrere i siti WordPress si verifica quando c’è una grande quantità di dati caricati automaticamente nella tabella wp_options. Questo è in genere il risultato di quanto segue:

  • I dati vengono caricati automaticamente da un plugin quando in realtà dovrebbe essere impostato su “no”. Un buon esempio viene offerto da un plugin per moduli di contatto. Ha davvero bisogno di caricare i dati su ogni pagina, o solo sulla pagina dei contatti?
  • Plugin o temi sono stati rimossi dal sito WordPress, ma le loro opzioni sono ancora nella tabella wp_options. Ciò potrebbe significare che dati non necessari che sono caricati automaticamente vengono riportati nei risultati delle interrogazioni ad ogni richiesta.
  • Gli sviluppatori di plugin e temi caricano i dati nella tabella wp_options invece di utilizzare proprie tabelle. Ci sono argomenti a favore e contro questa prassi, dal momento che alcuni sviluppatori preferiscono i plugin che non creano tabelle aggiuntive. Tuttavia, la tabella wp_options non è stata progettata per contenere migliaia di righe.

Quanto sono troppi i dati caricati automaticamente? Questi possono variare, naturalmente, ma idealmente, si potrebbe desiderare che siano compresi tra 300 KB e 1 MB. Una volta che ci si comincia ad avvicinare all’intervallo di 3-5 MB o più, molto probabilmente ci sono cose che potrebbero essere ottimizzate o rimosse dal caricamento automatico. E qualsiasi cosa al di sopra di 10 MB dovrebbe essere affrontata immediatamente. Ciò non significa sempre che questo causerà un problema, ma è sicuramente un buon punto da cui cominciare.

Risoluzione dei Problemi Relativi ai Dati Caricati Automaticamente nella Tabella wp_options

Se stai riscontrando lentezza sul tuo sito WordPress, ciò potrebbe essere dovuto a una query o dati caricati automaticamente da un vecchio plugin di WordPress. Di seguito mostreremo come controllare le dimensioni dei dati caricati in automatico nel tuo database, analizzeremo in profondità i dati di un sito live e condivideremo con voi le operazioni effettuate per ripulirlo.

Controllare le Dimensioni dei Dati Caricati Automaticamente

La prima cosa da fare è controllare l’attuale dimensione dei dati caricati in automatico sul sito WordPress. A questo scopo, accedi a phpMyAdmin. Fai clic sul tuo database sulla sinistra e poi sulla scheda SQL. Quindi inserisci il seguente comando e premi “Vai”.

SELECT SUM(LENGTH(option_value)) as autoload_size FROM wp_options WHERE autoload='yes';

Potrebbe essere necessario modificare la query qui sopra se il tuo sito WordPress utilizza un prefisso diverso da wp_.

Query autoload size in phpMyAdmin
Query autoload size in phpMyAdmin

Il campo autoload_size verrà restituito in byte. Ci sono 1024 byte in un KB e 1024 KB in un MB. Quindi nel nostro caso 249.025 byte equivalgono a 0.25 MB. Quindi per questo sito, questa è una buona dimensione! Se si ottiene qualcosa al di sotto di 1 MB non bisognerebbe preoccuparsi. Tuttavia, se il risultato è di molto superiore a 1 MB, allora sarà opportuno proseguire la lettura di questo tutorial.

Dimensioni autoload
Dimensioni autoload

Di seguito è riportato un sito che stavamo testando nel quale sono stati restituiti 137.724.715 byte o, meglio, 137 MB. Questo è un buon esempio di un sito in cui c’è qualcosa di decisamente sbagliato, o piuttosto in cui ci sono cose da ottimizzare.

Grande quantità di dati automatici nella tabella wp_options
Grande quantità di dati automatici nella tabella wp_options

É anche possibile utilizzare una query più lunga come quella che segue. Questo esempio mostra la dimensione dei dati caricati automaticamente, il numero di voci che ci sono nella tabella e le prime 10 voci per dimensione.

SELECT 'autoloaded data in KiB' as name, ROUND(SUM(LENGTH(option_value))/ 1024) as value FROM wp_options WHERE autoload='yes'
UNION
SELECT 'autoloaded data count', count(*) FROM wp_options WHERE autoload='yes'
UNION
(SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC LIMIT 10)
Query MySQL avanzata dati automatici
Query MySQL avanzata dati automatici

Se avete accesso a New Relic (licenza obbligatoria), potete utilizzarlo anche per aiutarvi a risolvere i problemi delle query relative alla tabella wp_options. La scheda Database metterà in evidenza la tabella e il tipo di query che impiega più tempo. Se selezioni una delle voci nell’elenco, potrai visualizzare ulteriori dettagli, comprese alcune query di esempio. Nell’esempio qui sotto, sono evidenti i dati caricati automaticamente nella tabella wp_options. Era già quasi certo, ma una rapida analisi del sito in questione ha confermato quasi 250 MB di dati caricati automaticamente.

By reviewing the slow query details you get a sense for what you need to look for in the database.

Ordinare i Principali Dati Caricati Automaticamente

Il passo successivo sarebbe quello di ordinare rapidamente i principali elementi contenenti dati caricati in automatico. Quella che segue è una veloce istruzione SQL che potete utilizzare per listare i primi 10 elementi:

SELECT option_name, length(option_value) AS option_value_length FROM wp_options WHERE autoload='yes' ORDER BY option_value_length DESC LIMIT 10;

Anche in questo caso, potrebbe essere necessario modificare questa query se il vostro sito WordPress utilizza un prefisso diverso da wp_.

Principali dati automatici
Principali dati automatici nella tabella wp_options

Scavare tra Specifici Dati Caricati Automaticamente in wp_options

Il passo successivo è scavare tra alcuni dei principali dati caricati automaticamente.

301_redirects

Come si vede qui sopra, la principale opzione di caricamento automatico è 301_redirects. Questo è probabilmente correlato direttamente ad un plugin di reindirizzamento presente nel sito, o al plugin WordPress SEO, che pure dispone di una funzione di reindirizzamento. In questo caso, la miglior consiglio è quello di implementare i reindirizzamenti a livello di server.

Perché? Poiché l’utilizzo di plugin gratuiti di WordPress per implementare i reindirizzamenti può a volte causare problemi di prestazioni, dato che molti di essi utilizzano la funzione wp_redirect, che richiede l’esecuzione di codice e risorse aggiuntivi. E, naturalmente, carica automaticamente dati nella tabella wp_options.

Se siete un cliente di Kinsta, potete aggiungere facilmente i reindirizzamenti a livello di server usando lo strumento per le regole di redirect all’interno della dashboard di MyKinsta. Non solo è meglio per le prestazioni, ma avete anche un plugin in meno di cui preoccuparvi!

Aggiungere regole di redirect in MyKinsta.
Aggiungere regole di redirect in MyKinsta.

wpurp_custom_template_

La successiva opzione relativa a dati caricati automaticamente è wpurp_custom_template_#. Possiamo vedere che ci sono diverse righe per questa opzione. Normalmente dovreste essere in grado di trovare questa opzione e collegare i punti cercando nella cartella temi o plugin. In questo caso, abbiamo eseguito un comando grep dal server per vedere se riuscivamo a trovarla. Potreste anche provare tramite SFTP.

grep -Ri "wpurp_custom_template_"

Il comando, però, non ha restituito nulla e quindi siamo andati su Google e abbiamo eseguito una ricerca. Abbiamo rapidamente scoperto che era collegato ad un plugin di WordPress che non era più installato sul sito, noto come WP Ultimate Recipe. Questo è un classico esempio di inutili dati “autoloaded” rimasti indietro. Abbiamo un lungo tutorial su come disinstallare i plugin di WordPress (nel modo giusto). E, per far le cose nel modo giusto, intendiamo ripulire realmente ciò che è rimasto indietro.

wpurp_custom_template_
wpurp_custom_template_

um_cache_userdata_

La successiva opzione relativa a dati caricati in automatico è um_cache_userdata_#. Possiamo vedere che ci sono diverse righe con questa opzione. Dato che eravamo verso la fine, abbiamo rapidamente modificato il comando MySQL in modo da mostrare le primi 40 righe di dati caricati automaticamente:

SELECT option_name, length(option_value) AS option_value_length FROM wp_options WHERE autoload='yes' ORDER BY option_value_length DESC LIMIT 40;

Possiamo anche fare la somma di tutti i valori aventi quel prefisso:

SELECT 'sum size in KiB', ROUND(SUM(length(option_value))/1024,0) FROM wp_options WHERE autoload='yes' AND option_name like "um_cache_userdata_%"

Abbiamo visto che c’erano molte più ricorrenze per um_cache_userdata_# nella tabella wp_options. Abbiamo eseguito di nuovo un comando grep per controllare le nostre cartelle di temi e plugin.

grep -Ri "um_cache_userdata_"

Siamo stati quindi in grado di collegare rapidamente questa opzione al plug-in Ultimate Member. Un’altra rapida ricerca su Google ha fornito alcune buone soluzioni a questo problema (si legga l’articolo di supporto). Non sottovalutate mai la potenza di una ricerca su Google! É venuto fuori che ci sono diverse opzioni disponibili nel plugin per risolvere questo problema.

  • Ultimate member -> Dashboard -> User Cache > Clear Cache.
  • Ultimate member -> Settings -> Advanced -> Stop caching user’s profile data (passare a ON), quindi salvate le modifiche.

Un’altra opzione per vedere a cosa corrisponda un’opzione caricata in automatico è premere il pulsante di modifica, e questo può listare la directory del plugin/tema o il sito web dello sviluppatore.

Cron Job

Un’altra opzione che vediamo di frequente associata ad una grande quantità di dati caricati in automatico è cron. Per questo, potrebbe essere qualsiasi cosa correlata con cron. Quindi quello che potete fare è premere il pulsante “modifica” per vedere da che cosa sia generato. Ecco un esempio in cui è evidente che il problema era causato da “do_pings”. Ancora una volta, una rapida ricerca su Google ha fornito una soluzione rapida per ripulire i do_pings.

cron – do_pings
cron – do_pings

Ripulire la Tabella wp_options

Se vedete molto di quanto abbiamo menzionato sopra, probabilmente è il momento di ripulire tutti i dati caricati automaticamente nella vostra tabella wp_options. Si consiglia anche di provare a mantenere il numero di righe della tabella wp_options al minimo. Fate sempre un backup prima di cancellare i dati nel database. Se non vi senti sicuri a farlo da soli, vi consigliamo sempre di dare l’incarico ad uno sviluppatore WordPress. Questa, inoltre, è una situazione in cui può tornare utile un ambiente di staging.

Come abbiamo fatto prima, dovrete accedere a phpMyAdmin. Cliccate sul nome del vostro database sul lato sinistro e poi sulla scheda SQL. Quindi inserite il seguente comando e cliccate su “Vai”.

SELECT * FROM `wp_options` WHERE `autoload` = 'yes'

Potrebbe essere necessario modificare la query riportata qui sopra se il vostro sito WordPress utilizza un prefisso diverso da wp_. Questa query mostrerà tutti i dati nella tabella wp_options che sono impostati per il caricamento automatico.

Cerca righe automatiche in wp_options
Trovare dati automatici in wp_options

Scorrendo tra le righe vediamo ogni sorta di plugin che non sono più installati o utilizzati dal sito. Si tratta solo dell’esemio che stiamo per utilizzare, ma in questo caso abbiamo notato un sacco di righe generate da Jetpack. E Jetpack non veniva più utilizzato sul sito in questione.

Vecchi dati automatici
Vecchi dati automatici

È sempre utile controllare la documentazione dello sviluppatore del plugin poiché a volte prevedono un’opzione per ripulire le tabelle lasciate indietro. In questo caso, a volte è più semplice e sicuro semplicemente installare di nuovo il plugin, controllare l’opzione di pulizia automatica e quindi rimuovere il plugin correttamente. Comunque, vi mostreremo come ripulire manualmente le tabelle.

Quindi, in questo caso, abbiamo eseguito la seguente query per trovare i dati caricati automaticamente nella tabella wp_options dal plugin Jetpack. Per modificare la query con le vostre, è sufficiente sostituire %jetpack%.

SELECT * 
FROM `wp_options` 
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%jetpack%'

Potete, quindi, selezionare tutte le righe e cliccare su “Elimina”.

Eliminare tabelle automatiche
Eliminare tabelle automatiche

In alternativa, potete eseguire questo comando:

DELETE
FROM `wp_options` 
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%jetpack%'
Query MySQL di eliminazione
Eliminare dati automatici nella tabella wp_options

Potete quindi ripulire e ripetere per ulteriori dati caricati in automatico lasciati indietro da plugin e temi nella tabella wp_options.

Ripulire i dati temporanei

A meno che non stiate utilizzando una object cache, WordPress memorizza i record temporanei nella tabella wp_options. In genere a questi dati viene assegnata una scadenza e dovrebbero scomparire in un certo lasso di tempo. Tuttavia non è sempre così. Abbiamo visto alcuni database contenenti migliaia di vecchi record di dati temporanei. È anche importante notare che i dati temporanei non devono essere caricati automaticamente di default. Potete utilizzare una query come questa di seguito per verificare la presenza di dati temporanei caricati in automatico.

SELECT * 
FROM `wp_options` 
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%transient%'

Tuttavia, un’opzione migliore e più sicura sarebbe quella di utilizzare un plugin gratuito come Transient Cleaner che è in grado di eliminare dalla tabella wp_options solo i dati temporanei scaduti.

Pulire le Sessioni di WordPress

Un altro problema comune che abbiamo riscontrato è che a volte i cron job non sono sincronizzati o non vengono eseguiti correttamente e quindi le sessioni non vengono pulite. Si può finire per avere tonnellate di righe _wp_session_ nel database. Nell’esempio qui sotto, il sito in questione si è ritrovato con oltre 3 milioni di righe nella tabella wp_options. E la tabella era cresciuta fino a oltre 600 MB di dimensione.

tabella wp_options con milioni di righe
tabella wp_options con milioni di righe

È possibile usare una query come quella riportata di seguito per verificare se si è in presenza di questo problema:

SELECT * 
FROM `wp_options` 
WHERE `option_name` LIKE '_wp_session_%'
wp_session rows
_wp_session_ rows

Nella maggior parte dei casi si possono cancellare in modo sicuro (come dovrebbe fare un cron job) con il seguente comando:

DELETE FROM `wp_options` 
WHERE `option_name` LIKE '_wp_session_%'

Dopo aver ripulito tutte le righe residue di _wp_session_ rows, la tabella aveva meno di 1.000 righe ed era ridotta a 11 MB di dimensione.

Sessioni WP ripulite
Sessioni WP ripulite

Ha anche risolto i picchi che il sito aveva in MySQL.

Transazioni web MySQL
Transazioni web MySQL

Aggiungere un Indice al campo Autoload

E se la pulizia della vostra tabella wp_options non fosse sufficiente, potreste provare ad aggiungere un “indice” al campo autoload. Questo in sostanza può consentire che sia recuperato in modo più efficiente nelle ricerche. Il fantastico team di 10up ha implementato diversi scenari di prova su una tabella wp_options con un numero rappresentativo di record caricati automaticamente per dimostrare come l’aggiunta di un indice all’autoload nelle query su wp_options possa migliorare le prestazioni.

Tempo di interrogazione di wp_options
Tempo di interrogazione di wp_options (img src: 10up)

Consigliamo, inoltre, di leggere queste due risorse aggiuntive di WP Bullet:

Per ulteriori suggerimenti sull’ottimizzazione, date un’occhiata alla nostra guida approfondita: Come Velocizzare il Vostro Sito WordPress (Guida Definitiva)