Ottimizzare WordPress per renderlo più veloce

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.

Compressione dei dati

  • Compressione di CSS e Javascript – Code Beautifier è uno strumento online che permetto di ottenere ottimi risultati nella compressione dei CSS. Esso ti permette di accorciare le notazioni, ridurre il testo inutile, unire i selettori, comprimere i codici di colore e le proprietà dei font, rimuovere backslashes & new lines e scartare proprietà non valide. Per la compressione dei Javascript, ci sono moltissimi strumenti che la permettono come  Minify JavascriptYUI CompressorDojo CompressorJSCompress. Ogni compressore utilizza il suo algoritmo e quindi devi solamente scegliere quello che ti piace di più. Se non vuoi effettuare queste operazioni manualmente esistono dei Plugin per WordPress che ti consentono di automatizzare quasi totalmente questi processi. A tal proposito posso suggerire alcuni plugin come Web Optimizer (molto ben realizzato, ma per completare tutti i task è necessaria la versione pro – a 99 dollari – perché con quella free si possono effettuare solo poche operazioni) oppure Autoptimize plugin che è invece completamente gratuito. Questi plugin possono praticamente fare ogni cosa necessaria a velocizzare il caricamento del frontend come comprimere CSS e JS, unire tutti i file CSS e JS in uno solo, fare caching del sito, comprimere html, immagini e anche ottimizzare le installazioni vps di wordpress.Ci sono altri plugin in grado di comprimere  singolarmente i vari file come: Script Compressor – per JS e CSS, WP-JS – per JS, WP-Minify – per JS e altri come WP-HTML-CompressionGZippy.Nota bene che l’uso di troppi plugin di compressione può rallentare il tuo sito invece di velocizzarlo a causa di possibili conflitti quindi assicuratevi di utilizzare soltanto un plugin per ogni tipo di compressione.NB: Per migliorare le performance cercate di far caricare i Javascript a fondo pagina – dopo la chiusura del tag body e i CSS subito dopo il tag head di apertura.NB: Se riuscite a unire tutto il vostro codice CSS in un singolo file e tutto il vostro codice JS in un singolo file e poi li comprimente otterrete moltissimi vantaggi in termini di velocità. L’unica controindicazione a questa procedura è quella di unire insieme file JS che utilizzano  jquery e mootools – li renderà inutilizzabili.
  • Compressione delle Immagini – Le immagini sono uno dei fattori principe nell’aumento della dimensione delle pagine web. Esistono fondamentalmente 2 metodi per comprimerle. Il primo metodo è quello di utilizzare il vostro image editor preferito. Il secondo invece è quello di utilizzare Smush.it di Yahoo. Smush.it è anche disponibile come plugin per wordpress e permette di comprimere e caricare le immagini automaticamente.

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:

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

Ridurre le Query PHP

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.

  1. <?php language_attributes(); ?> nel file header.php.
  2. <?php bloginfo(‘html_type’); ?> nel file header.php.
  3. <?php bloginfo(‘charset’); ?> nel file header.php.
  4. <?php bloginfo(‘name’); ?> si trova un po’ ovunque nel vostro tema.
  5. <meta name=”generator” content=”WordPress <?php bloginfo(‘version’); ?>” /> <!– leave this for stats –> in header.php. Questo va eliminato anche per evitare che chiunque conosca la versione del nostro WP.
  6. <?php bloginfo(’stylesheet_url’); ?> nel file header.php.
  7. <?php bloginfo(‘rss2_url’); ?> nei file header.phpsidebar.php and footer.php. Assicuratevi di cambiare manualmente questi campi nel caso in cui decidiate di passare a FeedBurner dopo aver fatto queste modifiche.
  8. <?php bloginfo(‘pingback_url’); ?> nel file header.php.
  9. <?php bloginfo(’stylesheet_directory’); ?> si trova un po’ ovunque nel vostro tema.
  10. <?php bloginfo(‘description’); ?> si trova un po’ ovunque nel vostro tema.
  11. <?php bloginfo(‘comments_rss2_url’); ?> found in sidebar.php and footer.php.
  12. <!– <?php echo get_num_queries(); ?> queries. <?php timer_stop(1); ?> seconds. –> nel file footer.php.
  13. Se usate i widgets, potete eliminare il codice che trovate nel file sidebar.php tra le linee<?php /* Widgetized sidebar, if you have the plugin installed. */
    if ( !function_exists(‘dynamic_sidebar’) || !dynamic_sidebar() ) : ?>

    e
    <?php endif; ?>
    Il codice contenuto tra queste linee di codice viene utilizzato solamente nel caso in cui non utilizziate i wdget. Se credete che utilizzerete sempre i widget non c’è motivo di lasciare questo codice.

Ridurre la dimensione delle pagine

  • Rimuovere Widget non utilizzati o non necessari – Analizzate attentamente i widget che utilizzate nel vostro footer e nella vostra barra laterale e domandatevi se realmente questo widget aggiunge valore al vostro sito. Se la risposta è no allora questo widget non fa altro che aumentare la dimensione della vostra pagina e dunque la sua velocità.
  • Ridurre il numero di commenti visualizzati – Se avete un sito molto popolare è facile ottenere una quantità molto alta di commenti e molto spesso con avatar allegato. Per molti utenti la presenza di tantissimi commenti può causare un grosso collo di bottiglia e dunque rallentare considerevolmente il caricamento della pagina. A partire dalla versione 2.7 di WordPress è possibile splittare i commenti in più pagine nella sezione Impostazioni -> Discussione.

Caching del Frontend

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 CacheHyper Cache solo dopo aver controllato che non vadano in conflitto con altri plugin che già utilizzate.

CDN (Content Distribution/Delivery Network)

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.

Caricare solo quando necessario – Usate i Conditional Tags

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:

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' );
}

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:

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' );
}
}

Con queste piccole modifiche potrete perfezionare il vostro WordPress e caricare in modo perfetto ogni file solo dove e quando vorrete.

Suggerimenti

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

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

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.

45 Risposte so far.

  1. [...] qualche trucchetto per ottimizzare WordPress in modo da migliorarne la velocità.Lo trovate qui: http://www.andreapernici.com/wordpress/ottimizzare-wordpress-per-renderlo-piu-veloce/Lascia una Risposta Nome (obbligatorio) Mail (non sara' pubblicata) (obbligatorio) Sito [...]

  2. RT @riga75 Ottimizzare WordPress per renderlo più -http://www.andreapernici.com/wordpress/ottimizzare-wordpress-per-renderlo-piu-veloce/

  3. Giorgio scrive:

    Articolo molto interessante e utile, soprattutto in vista dei cambiamenti previsti nel nuovo algoritmo di Google (Caffeine) che sembrerebbe dare peso rilevante alla velocità di caricamento di un sito. Grazie per la segnalazione dei vari plugin!

  4. Ciao @Giorgio. Grazie a te !

  5. Ivan scrive:

    Guida spettacolare! Ottimo un monumento ti dovrebbero fare.

  6. @Ivan esagerato!!!! Troppo gentile e grazie mille per il monumento ;)

  7. Emanuele scrive:

    Grazie per il tuo splendido articolo.
    Sto cercando di implementare al meglio il codice per rimuovere CSS da pagine in cui non servono.
    Ho provato a modificarlo così:
    add_action( ‘wp_print_scripts’, ‘my_deregister_javascript’, 100 );

    function my_deregister_javascript() {
    if ( !is_page(‘Contatti’) ) {
    wp_deregister_script( ‘contact-form-7′ );
    }
    if ( !is_single() ) {
    wp_deregister_script( ‘wp-commentnavi’ );
    }
    }

    add_action( ‘wp_print_styles’, ‘my_deregister_styles’, 100 );

    function my_deregister_styles() {
    if ( !is_page(‘Contatti’) ) {
    wp_deregister_style( ‘contact-form-7′ );
    }
    if ( !is_single() ) {
    wp_deregister_script( ‘wp-commentnavi’ );
    }
    }

    ma si vede vero che non conosco il php? :)
    (volevo rimuovere il css del plugin wp-commentnavi dalle pagine che non sono articoli).
    Puoi aiutarmi?

  8. Ciao @Emanuele e grazie a te.
    Non conosco nello specifico wp-commentnavi ma se vai in edit plugin puoi vedere come chiama lui i suoi css e js.

  9. Emanuele scrive:

    Grazie per la risposta (anche se non la vedo qua sopra!).
    Il css “indesiderato” sta in plugins/wp-commentnavi/commentnavi-css.css?ver=1.10 e qquindi si presuppongo che wp-commentnavi vada bene come sintassi.
    Probabilmente l’errore sta nella “sintassi” di come ho scritto il tutto mettendo insieme sia CommentNavi che ContactForm7 :)

  10. @Emanuele il tuo codice mi sembra ok, ma credo che il problema sia nel nome che va dentro la funzione. Prova a mettere commentnavi-css. Tutto dipende da come è fatto il plugin.

  11. Emanuele scrive:

    Ok grazie,
    ho provato ma niente. Ho anche provato wp-commentnavi-css ma niente (la parte relativa a contact-form invece funziona bene).
    Questo è quello che aggiunge nell’header:

    Dove dovrei guardare per capire qual’è la “stringa” giusta?
    Grazie ancora per l’aiuto :)

  12. Emanuele scrive:

    Ciao,
    scusa se ti disturbo ancora. Ho provato su siti diversi e vari plugin ma l’unico con cui mi riesce di farlo funzionare è Contact Form 7.
    Hai qualche “input” da darmi per capire cosa devo mettere per gli altri plugin?

  13. Ottimo articolo. In particolare sono interessanti il plugin Autoptimize e quello che permette di sostituire le librerie Javascript con quelle hostate da Google.
    Avrei completato il tutto con qualche indicazione su una risorsa per fare un benchmark “obiettivo” che è sempre difficile da trovare.

  14. @Sergio Gandrus Sì sono due ottimi plugin…l’unico problema di autoptimize è che non svuota mai la cache e può occupare lo spazio su disco —> quindi ogni tanto va svuotata la cache. Per i benchmark direi che Yslow e PageSpeed siano ottimi strumenti utilizzabili come plugin di Firefox insieme a Firebug.

  15. @Emanuele Alcuni plugin che non usano il metodo adatto per aggiungere i js e i css non possono sfruttare quella funzione quindi devi entrare nel plugin e mettere gli if all’interno dei plugin stessi.

  16. [...] ed anche alcuni concetti che molti ignoravano e con la storia della caffeina, del real time e della velocità dei siti a spinto un po’ tutti ad applicarsi e fare ricerca di soluzioni ottimali per le proprie [...]

  17. Sia Yslow che PageSpeed sono buoni add-on (che ho recensito in post del mio blog) però intendevo un tool esterno, basato su server, che giudicasse in maniera obiettiva il caricamento.
    Un servizio decentralizzato che facesse stare tranquillo l’ottimizzatore del sito

  18. Sai @Sergio trovare un tool di questo tipo non è poi così rassicurante perché comunque bisogna considerare molti fattori come la posizione del server da cui si fa il test, lo stato della rete etc etc…tanti fattori insomma che comunque non ci lascerebbero tranquilli :)

  19. Per Google la velocità di caricamento di un sito è diventato un fattore importante per l’indicizzazione.
    Se seguono la solita linea di comportamento, metteranno a disposizione degli sviluppatori gli stessi strumenti che loro utilizzano per le variabili dell’algoritmo. Quindi, forse, un tool (bilanciato sui vari server) che misuri questo valore.
    Vedremo.

  20. [...] gli aggiornamenti via e-mailPOPOLARICOMMENTIFEATUREDTAG CLOUDGoogle News SitemapSociable ItaliaOttimizzare WordPress per renderlo più veloceAlcuni Fantastici Loghi con messaggio nascostoPlugin WordPress per generazione di Google News [...]

  21. Stefy scrive:

    Come posso sapere se il mio hosting è abilitato per la compressione gzip? Ho incollato nel file .htaccess il codice che ho trovato nell’articolo, ma la compressione non è attiva.

  22. Ciao Stefy,
    per vedere se è compresso puoi usare questo tool online http://www.whatsmyip.org/http_compression/, ma per capire se è abilitato devi sentire il tuo hosting provider anche perché potresti avere attivo il modulo gzip e non il deflate.

  23. Stefy scrive:

    Mi dice che non è attivo infatti :( Per il modulo gzip devo sempre incollare qualcosa nel file htaccess? Cosa?

    Grazie!

    • Stefy scrive:

      Vorrei evitare l’uso di altri plugin e utilizzare solo il file htaccess :)

      • Prima di provare ad utilizzare le varie direttive secondo me ti conviene chiedere al tuo hosting provider e poi sulla base di questo regolarti di conseguenza.

        Devi sapere che versione di apache gira, che moduli sono installati, se puoi usare htaccess per modificare queste direttive…insomma tutta una serie di cose che ti permettono di decidere la strada da adottare perché la compressione delle pagine è un incrocio ampio quindi ci sono molti modi di abilitarlo.

  24. Stefy scrive:

    Ho fatto Andrea, ho chiesto se erano attivi i moduli gzip e deflate, ecco la triste risposta:

    Quei moduli non sono attivi in quanto causerebbero
    un aumento non indifferente del carico CPU sui
    server.

    :( Cosa posso fare per la compressione?

    • Prova con questo
      php_value output_handler ob_gzhandler
      ma non è detto che funzioni perché spesso su host condivisi non ti danno la possibilità di fare queste modifiche.

      Se non va puoi provare ad utilizzare uno dei plugin che ho elencato sopra.

  25. Stefy scrive:

    Quella stringa dovrei inserirla sempre nel file htaccess?

    Nel frattempo ho provato pure a inserire questa nel file header.php:

    Peccato che non funzioni, mi esce un messaggio di errore che mi dice “la compressione non è supportata”.

  26. Stefy scrive:

    Ho inserito quel tuo codice nell’htaccess, il sito si apre senza problemi. Come posso capire se la tua stringa funziona e c’è la compressione?

    Prima non sono riuscita a copiarti la stringa che mi dava errore, non compare nel commento.

  27. Ciao Andrea,

    davvero complimenti per la guida. bookmarkata e stampata.

    Ho una domanda: nell’htaccess aggiungere questo codice

    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css

    SetOutputFilter DEFLATE

    da lo stesso effetto del codice da te proposto per la compressione?

    li ho testati entrambi con YSlow è il risultato è lo stesso. Mi chiedo se una delle due versioni è più accurato o offre più vantaggi o se invece no.

    Grazie.

    • Ciao juzdongivaphuck e grazie mille.

      Quel codice è esattamente identico ed è solo la definizione inline delle stesse direttive.

      Le ho messe distinte per far capire che in base al tipo di file può essere specificato se comprimere oppure no.

  28. Confermo il problema Autoptimize…che su siti trafficati alla lunga riempie anche lo spazio su disco e blocca la creazione delle pagine…basta svuotare la cache ogni tanto e direi che attendiamo la tua modifichina al plugin ;)
    Grande Sergio…ottimo post.

  29. [...] var _wpcf7 = { cached: 1 }; // WordPressGoogle News SitemapOttimizzare WordPress per renderlo più veloceRich Category EditorSociable ItaliaWP Super Secure and Fast htaccessApacheI File di [...]

  30. [...] WordPress: XCache e W3 Total Cache (e salva il tuo server) WordPressGoogle News SitemapOttimizzare WordPress per renderlo più veloceRich Category EditorSociable ItaliaWP Super Secure and Fast htaccessApacheI File di [...]

  31. [...] Ottimizzare WordPress per renderlo più veloce [...]

  32. Marc scrive:

    Sei davvero molto bravo e gentile a scrivere articoli cosi’ interessanti ed utili. Continua cosi! Ti ho trovato in rete per caso…spero di sentire sempre di piu’ il tuo nome nel settore SEO italiano. Ciao.

  33. Fabrizio scrive:

    Complimenti davvero, proverò senz’altro a mettere in atto almeno un paio dei tuoi ottimi consigli.
    Grazie per averli condivisi.

Leave a Reply