Quando parliamo di ottimizzazione di WordPress un punto molto importante è quello relativo alla velocità di caricamento delle nostre pagine web in modo da rendere migliore l’esperienza utente. Come ho già accennato all’argomento dopo il convegno gt con il post su Web Performance Optimization credo sia il momento di realizzare una pagina dedicata all’argomento applicato a wordpress.
Il processo di ottimizzazione che descriverò di seguito non va applicato tutti i giorni, settimane o mesi, ma può essere fatta poche volte durante il corso di un anno. L’ottimizzazione può essere fatta sia sul backend che sul frontend, ma in questa pagina parleremo esclusivamente del lato pubblico ossia Ottimizzazione del Frontend.
Dopo aver caricato le nostre pagine, se andiamo a controllare il codice sorgente generato da wordpress ci possiamo accorgere che vengono spesso caricati degli script che non servono assolutamente ai nostri visitatori, ma che aggiungono peso e tempo di caricamento ad esse. Questo caricamento di inutilità viene causato spesso dal caricamento di widget o javascript non utilizzati, di css non utilizzato oppure dalla presenza di codice errato o broken link. Per riparare a queste imperfezioni è necessario spulciare il codice delle nostre pagine e capire quali sono questi file che vengono erroneamente caricati.
NB: I plugin che consentono la compressione gzip dei file CSS, JS etc… (non immagini e contenuti già compressi mi raccomando) possono essere evitati se avete la possibilità di abilitare lato server il mod_deflate di Apache e aggiungere poi al vostro file httpd.conf o .htaccess il seguente codice:
{code type=php}AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/x-httpd-eruby
AddOutputFilterByType DEFLATE text/html
# Istruzioni necessarie per evitare che vengano compressi i file già compressi come immagini, video, pdf etc etc
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.avi$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mov$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp3$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.mp4$ no-gzip dont-vary
SetEnvIfNoCase Request_URI \.rm$ no-gzip dont-vary
# Istruzioni necessarie per compatibilità con vecchi browser
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
{/code}
Analizzando i file del tema che utilizzate vi accorgerete che moltissimo codice viene generato dinamicamente come il percorso dei file, il percorso dei css, il percorso delle immagini, il percorso dei feed rss di post-pagine commenti, l’html encoding, il titolo del blog e la sua descrizione e moltissimo altro codice. Riuscire a rimpiazzare questo codice con i valori reali permette di risparmiarsi l’esecuzione di moltissime query. Possiamo identificare i tag rimpiazzabili come 13. Il modo più semplice di fare questa operazioni di sostituzione è quello di caricare la pagina, visualizzare il codice html e copiarlo in un file. Una volta copiato questo file fate una copia di backup dei file del vostro tema e modificateli sostituendo i seguenti valori con i rispettivi della pagina html caricata.
Come detto precedentemente ogni volta che il vostro sito viene caricato tutto il codice php del CMS viene eseguito. Se avete un’ottimo piano hosting questo non dovrebbe essere un grosso problema, ma nel caso in cui per qualsiasi motivo vi troviate ad avere a che fare con un picco di traffico molti visitatori accederanno contemporaneamente al vostro sito e il vostro server potrebbe non riuscire a gestire facilmente questa situazione.
Per evitare questo problema è possibile utilizzare il meccanismo di caching di cui parlavamo per trasformare l’output della pagina php in un file HTML statico che può essere servito ai visitatori in modo molto più veloce. La cache delle vostre pagine può essere rigenerata a intervalli orari e sulla base della frequenza con cui aggiornati il vostro sito web. Con WordPress per applicare questo meccanismo potete usare dei plugin come W3 Total Cache, WP Super Cache e Hyper Cache solo dopo aver controllato che non vadano in conflitto con altri plugin che già utilizzate.
CDN è una tecnica che permette di servire i contenuti del vostro sito da server diversi distribuiti in varie parti del mondo, in modo da distribuire il carico del vostro server in modo equo tra i vari server e permettendo dunque un caricamento più rapido delle vostre pagine. Uno dei migliori servizi qualità-prezzo è sicuramente Amazon Cloudfront service con il loro S3 Service. Utilizzando questo servizio potrete hostare tutti i file CSS, JS, Immagini, Video e Audio sulla CDN Amazon con la possibilità di utilizzare dei plugin appositi come Simple Amazon S3 Upload form oppure Amazon S3 for WordPress.
Un altro plugin molto buono se utilizzare AJAX è quello di sfruttare la CDN di Google con il plugin Use Google Libraries che sostituisce in automatico i file AJAX locali con il percorso corrispondente sui server Google.
Gli autori di Plugin hanno spesso la brutta abitudine di includere JS e CSS nell’header senza includere dei controlli per il caricamento di essi solo in caso di effettivo utilizzo. In questo modo ogni plugin relativo al plugin viene caricato su ogni pagina e questo causa un drammatico rallentamento del caricamento della pagina. I metodi che possono essere utilizzati sono molteplici e ce ne sono alcuni complessi ed altri meno, ma in ognuno di essi è necessario un po’ di conoscenza del codice e dunque un po di “smanettamento”. Queste operazioni anche se non proprio immediate e di facile applicazione sono uno dei punti fondamentali nell’ottimizzazione della velocità del vostro sito basato su piattaforma wordpress.
In questa pagina vi mostrerò uno dei modi più semplici esistenti per realizzare questo snellimento delle pagine.
Andate nel file functions.php del vostro tema ed aggiungete questo codice:
{code type=php}add_action( ‘wp_print_scripts’, ‘my_deregister_javascript’, 100 );
function my_deregister_javascript() {
wp_deregister_script( ‘nome-js-del-plugin’ );
}
add_action( ‘wp_print_styles’, ‘my_deregister_styles’, 100 );
function my_deregister_styles() {
wp_deregister_style( ‘nome-css-del-plugin’ );
}
{/code}
E in modo molto semplice vedrete esclusi CSS e JS specificati.
Per migliorare questa tecnica ed applicarla in modo perfetto alle vostre esigenze potete utilizzare i Conditional Tag di Worpress.
Vi faccio un esempio che credo faccia riferimento ad uno degli scenari più consueti…Plugin Contact Form 7. Questo plugin include in tutte le vostre pagine il proprio CSS e JS. Ovviamente uno dei casi più frequenti è quello di utilizzo del plugin in questione sulla pagina chiamati “Contatti”.
Supposto questo scenario per quale motivo dobbiamo portarci dietro il codice CSS e JS di questo plugin in tutte le pagine ? Perché non farli caricare solamente nella pagina in cui effettivamente lo usiamo ?
Ecco la soluzione combinando gli script precedenti con i conditional tags:
{code type=php}add_action( ‘wp_print_scripts’, ‘my_deregister_javascript’, 100 );
function my_deregister_javascript() {
if ( !is_page(‘Contatti’) ) {
wp_deregister_script( ‘contact-form-7’ );
}
}
add_action( ‘wp_print_styles’, ‘my_deregister_styles’, 100 );
function my_deregister_styles() {
if ( !is_page(‘Contatti’) ) {
wp_deregister_style( ‘contact-form-7’ );
}
}
{/code}
Con queste piccole modifiche potrete perfezionare il vostro WordPress e caricare in modo perfetto ogni file solo dove e quando vorrete.
Aggiornate regolamente WordPress, temi e plugin e scegliete attentamente il vostro hosting provider (se volete ne conosco di ottimi per wordpress). Nel caso in cui abbiate il vostro server allora ricordatevi di aggiornarlo regolarmente per evitare possibili problemi. Se ne avete la possibilità chiedete di farvi abilitare o di abilitare voi stessi i moduli di Apache – Headers e Expires – e poi aggiungere nel vostro httpd.conf o .htaccess il seguente codice adeguatamente modificato (ho messo 2 tipologie di uso del controllo della scadenza quindi scegliete quello che preferite – con data fissa oppure con durata massima).
{code type=php}Header unset Pragma
FileETag None
Header unset ETag
Header set Cache-Control “public”
Header set Expires “Thu, 15 Apr 2010 20:00:00 GMT”
Header unset Last-Modified
Header set Cache-Control “max-age=7200, must-revalidate”
Header set Cache-Control “public”
Header set Expires “Thu, 15 Apr 2010 20:00:00 GMT”
Header unset Last-Modified
{/code}
In questo modo aggiungerete al vostro sito delle scadenza per i file che non hanno bisogno di essere ricaricati ogni volta dal browser e permetterete l’uso della cache e delle scadenze anche lato server e velocizzando in modo significativo il vostro sito agli occhi di Google e dei vostri utenti.