WordPress

Impostare in maniera efficiente i permalink

Questo è un post tecnico di 6 anni fa. Le istruzioni potrebbero non essere più valide.

Avvertenza
La gestione dei permalink è stata notevolmente migliorata a partire da WordPress 3.3, per cui queste informazioni risultano obsolete. In termini assoluti, avere un valore numerico in testa al permalink dà prestazioni migliori; ma in termini pratici le differenze di performance tra l’avere un valore numerico e non averlo sono irrisorie se non addirittura inesistenti. Per informazioni dettagliate su come funzionano i permalink in WordPress 3.3 e versioni successive è utile il post di Otto.

wordpress-logoCirca un mese fa è nata una interessante discussione nel forum di WordPress relativa a un elevato e insolito numero di query al database (più di 2.000) ogni volta che si apriva una pagina di un determinato sito. La discussione si è portata avanti tra segnalazione nel Trac di WordPress, discussione in mailing-list e aggiunte al Codex, nonché su blog importanti come quello di Dougal Campbell (da cui questo articolo trae spunto). Credo sia utile far conoscere quanto si è discusso per nostra informazione e annotazione.

Il problema

Un utente di WordPress lamentava, come già detto, un elevato numero di query per ogni pagina aperta del suo sito, causando un rallentamento eccessivo; la navigazione era possibile, ma in modo molto lento e fastidioso. Su questo sito, che contava tantissime pagine e con svariati allegati, aveva tentato di tutto, disattivando qualsiasi plugin, rimettendo il tema standard e provando addirittura un hosting diverso (in locale). Il risultato fu che le query continuavano ad essere sempre le stesse. L’utente aprì quindi una discussione sul forum e, dopo qualche scambio di informazioni, si giunse alla conclusione che il problema era dovuto alla sua struttura dei permalink. Questa era del tipo /%category%/%year%/%monthnum%/%day%/%postname%/.

Come WordPress preleva gli articoli

Come sapete, WordPress è molto flessibile nella gestione dei permalink: fornisce all’utente la possibilità di poterla impostare come vuole lui, secondo i suoi gusti e le sue esigenze: %year%, %monthnum%, %day%, %hour%, %minute%, %second%, %postname%, %post_id%, %category%, %tag%, e %author%, combinandoli come meglio crede.

Per blog e siti di piccole dimensioni, una impostazione non proprio efficiente dei permalink non causa alcun problema di navigazione e, per restare nel problema al centro dell’articolo, non causa alcun rallentamento. Ma quando si ha davanti un sito con moltissime pagine statiche (intendo le pagine staccate rispetto al flusso temporale degli articoli), con tantissimi allegati, tantissimi post (quindi un sito molto “grande”) e una struttura dei permalink del tipo /%category%/%postname%/ oppure anche solo /%postname%/, allora il discorso cambia radicalmente. WordPress, infatti, davanti a questo materiale e con questi permalink fatica a trovare quello che si vuole. Vediamo perché. Per spiegarlo utilizzo lo stesso esempio che Otto ha usato nella discussione in mailing-list (metto in blockquote il testo, ma è una mia interpretazione libera del suo testo e non una traduzione).

Consideriamo un permalink del tipo /%category%/%postname%/. Un visitatore arriva nel blog cercando la pagina “mycat/mypost/”. Per noi è immediatamente comprensibile di cosa si tratta, ma non per WordPress, il quale inizia ad analizzare queste due voci.

Inizia con “mycat” e indaga su cosa sia. Dapprima si accerta se sia una pagina ed interroga il database: esiste nella tabella “wp_posts” un “post_slug” che ha “mycat” con “post_type” uguale a “page” (select from wp_posts where post_slug = mycat and post_type = page)? No, non esiste.

Quindi, tenta di vedere se “mycat” è una categoria. Esiste in “wp_terms” e (join) “wp_term_taxonomy” qualcosa in cui “term” è “mycat” e “taxonomy” è “category” (select from wp_terms join wp_term_taxonomy on (term_id = term_id) where term = mycat and taxonomy = category)? Si esiste. Ottimo, ma c’è un problema: è solo una categoria, non è il post che stiamo cercando. Passiamo oltre e ignoriamo la categoria.

WordPress lascia perdere, quindi, “mycat” e passa a “mypost”. E ricomincia la tiritera delle interrogazioni.

1. È una pagina (select from wp_posts where post_slug = mypost and post_type = page)? No.

2. È una categoria (select from wp_terms join wp_term_taxonomy on (term_id = term_id) where term = mypost and taxonomy = category)? No.

3. È un post (select from wp_posts where post_slug = mypost and post_type = post)? Sì. Bingo!

Da questo si capisce quanto le categorie (ad inizio permalink) non aiutino a determinare la natura di ciò che si sta cercando. Sono state eseguite ben cinque query (delle quali due molto dispendiose, join) solo per capire quale sia il post. E ciò avviene ogni volta che si vuole visualizzare un post sul vostro sito.

Immaginiamo, quindi, cosa succede quando un sito sia molto esteso e abbia tantissime visite ogni secondo. Per questo motivo WordPress, per evitare tali problemi quando rileva che la nostra struttura dei permalink non è efficiente, genera delle regole di reindirizzamento (rewrite_url) per ogni cosa scriviate (post, pagina, attachment), cui ricorre ogni volta che viene richiesta una pagina del sito (che sia un post o altro). Queste regole di reindirizzamento, però, crescono a dismisura quando il sito è enorme, quando ci sono tantissime pagine statiche e relativi attachment (era il caso dell’utente di poco fa). Questa tabella può crescere così tanto da causare problemi alla navigazione.

Come impostare nel modo più efficiente i permalink

Qual è, allora, la migliore impostazione dei permalink?

Se “migliore” lo intendiamo in termini di efficienza, senza dubbio essa consiste nell’usare come primo elemento del permalink un valore numerico (%year%, %monthnum%, %day%, %hour%, %minute%, %second% e %post_id%) o addirittura la struttuta standard miosito.com/?p=123 (che presenta altre problematiche, ma non in termini di efficienza). I problemi sorgono quando si mette come primo elemento un valore testuale come %postname%, %category%, %tag%, e %author%: in questo caso WordPress o esegue tutta quella tiritera o deve impostarsi delle regole di reindirizzamento: entrambi i sistemi sono comunque dispendiosi in termini di risorse.

Se il vostro sito/blog rientra nelle caratteristiche dette prima, rivedete i vostri permalink. Se avete un piccolo blog non preoccupatevi di nulla e usate pure la struttura che più vi piace.

Anche nel Codex è stato inserito, dopo la discussione in mailing-list, questo avviso:

For performance reasons, it is not a good idea to start your permalink structure with the category, tag, author, or postname fields. The reason is that these are text fields, and using them at the beginning of your permalink structure it takes more time for WordPress to distinguish your Post URLs from Page URLs (which always use the text “page slug” as the URL), and to compensate, WordPress stores a lot of extra information in its database (so much that sites with lots of Pages have experienced difficulties). So, it is best to start your permalink structure with a numeric field, such as the year or post ID. See wp-testers discussion of this topic.

La situazione di questo blog

Ubuntu block notes ha adottato per molto tempo la struttura /%category%/%postname%/, perché la ritengo ottima da punto di vista “umano”: si capisce subito sotto quale categoria si trova quell’articolo. Ma per i motivi su esposti ho cambiato la struttura utilizzandone una molto simile: /%year%/%category%/%postname%/, inserendo quindi un valore numerico all’inizio.

La differenza di peso dei due file contenenti le regole, prima e dopo la "cura"

La differenza di peso dei due file contenenti le regole, prima e dopo la "cura"

Prima di effettuare il cambio, però, ho dato un’occhiata al database per vedere cosa avessi nella tabella wp-options > rewrite_rules. Stentavo a crederci: quasi 2.000 linee di regole! Dopo il cambio dei permalink, ho rivisitato la tabella e le righe sono scese a 200, cioè un decimo! E pensare che questo blog è piccolo: attualmente 310 articoli, 26 pagine, 12 categorie e 361 tag (ma non so quanti attachment). È evidente che WordPress ringrazia e con lui il server su cui gira.

Per approfondire date un’occhiata anche agli interessanti commenti all’articolo di Dougal, dove gli utenti pongono domande su dubbi che probabilmente potranno sorgere a chi ha letto quest’articolo.

Update.
Ho preparato un diagramma di flusso per capire quando è il momento di cambiare la struttura dei permalink con una più efficiente:

Fare clic per ingrandire

  1. Ottimo articolo, davvero scritto bene, grazie, hai scritto un articolo utile a tutti.
    Io ho un Permalink del tipo di default, che però non mi piace ed ha delle problematiche, come dici tu.
    Ho provato a cambiarlo, però anche questo comporta dei grossi problemi, perché gli articoli collegati con vecchi Permalink non si aggiornano automaticamente. Avevo anche provato un plugin per Wordpress che si chiama Permalink Migrator, ma non mi è riuscito di configurarlo bene… :(

    Complimenti ancora per l’articolo, e grazie.

      • Se tu mi dici questo allora è possibile che questo reindirizzamento sia automatico nella versione 2.7, in effetti io ho fatto il tentativo con la vecchissima 2.3.1 (che ho mantenuto fino ad un mesetto fa, o poco più).
        L’effetto era che impostando un nuovo Permalink non si poteva in nessun modo accedere agli articoli, cliccando su un titolo nella pagina iniziale.
        Se tu sei sicuro che il cambio di Permalink produca un reindirizzamento automatico allora lo faccio subito, quindi aspetto una tua conferma.

        Ciao, e grazie tante per la disponibilità.

        P.S. riguardo al tuo consiglio, sul “magic quotes” non ci ho capito granché, magari potessi spiegarmi qualcosa a proposito, perché il nome non mi fa intuire nulla su cosa possa essere, e su come possa risolvere il mio problema… scusa la mia ignoranza, non sapevo neanche che esistesse il PHP 6, mi ero fermato al 5 :(

        • Il redirect dei permalink in WP esiste da non so quanto. Se cambi la struttura dei permalink e non avviene il redirect dai vecchi link ai nuovi, c’è qualche problema nella tua configurazione.

          La funzione “Magic Quotes” serve a far considerare le virgolette semplici, quelle doppie, i backslash ecc. come caratteri tali, premettendo automaticamente un backslash. Per motivi di sicurezza però verrà rimosso.

          PHP 6 è ancora in fase di sviluppo

        • Ci ho provato proprio adesso e… per magia… tutto funziona alla grande, la struttura dei Permalink è stata aggiornata con successo!!!!

          Non so come ringraziarti per avermi fatto riacquistare la fiducia che avevo perso dal tentativo fallito qualche tempo fa, perché è vero che non era riuscito, te lo dico per non sembrare un falso.

          Grazie ancora, ho risolto una questione che mi premeva da tantissimo tempo.

    • Se sei su Netsons e se non ricordo male, mi pare che loro consentano molte personalizzazioni. Prova a disabilitare “magic_quotes” dal tuo PHP. Vediamo se funziona. Tra l’altro “magic_quotes” è deprecato in PHP 5.3 e invece del tutto rimosso in PHP 6.

  2. Ciao e complimenti per l’articolo, anche se a me sembra che piu articoli leggo sui permalink e più mi confondo le idee. In pratica io ho un blog con circa 2000 articoli. il blog è aperto da un paio di mesi, e ho importato i post dal mio vecchio blogspot. Capirai gia tutti i problemi in cui sono incappato, e in pratica ho perso tutti i posizionamenti, piuttosto buoni, che avevano i vecchi post. Dopo aver letto non so quale post sull’ottimizzazione del permalink, ho modificato la struttura in /categoria/titolo, il problema non e nato in wp, bensi in Google, che ora mi segnala 600 meta description duplicate. Ora se rifaccio il cambio e imposto di nuovo la struttura /data/titolo, cosa succede? Penso che in WP non ci siano problemi, ma per quanto riguarda Google, che cosi vedrà di nuovo permalink modificati, quali saranno le reazioni?
    Un altra cosa, credi che il problema da te descritto, riguardi solo siti con molti più articoli o anche il mio blog?
    Ciao e Grazie

    • 1. Devi dare solo del tempo a Google di sapere come sono cambiate le tue pagine.

      2. Per quanto riguarda il tuo blog, il problema non sta nel numero degli articoli (posso avere un blog con migliaia di articoli, senza risentire di particolari problemi), ma in altre ragioni. Se un blog rientra in queste condizioni:

      a. il blog deve avere centinaia di pagine;
      b. possibilmente con tanti attachment
      c. la struttura dei permalink inizia con una variabile testuale

      allora è da considerare una migrazione dei permalink. Questo perché WordPress utilizza per le pagine statiche e gli attachment un valore sempre testuale; ora, se anche i post utilizzano un valore che non si distingue da quello usato per le pagine “statiche” (cioè non inizia per un numero), ecco che fa fatica a trovare gli articoli. Ovviamente devono esserci tanti articoli e pagine, per fare fatica (ed anche molti visitatori in contemporanea). Spero sia chiaro il concetto. Un semplice blog può usare la struttura che vuole, senza problemi.

      Ho preparato un diagramma per capire se è giunto il momento di cambiare questa struttura: lo trovi alla fine dell’articolo. Spero ti sia d’aiuto. :)

    • A prima vista no. O meglio: l’articolo ha nella home un link e se lo apro ne vedo un altro. o.O Per cui se parti da un link senza numero non sono efficienti al massimo.
      Domanda: Cosa hai messo nel pannello di WordPress relativamente ai permalink?

  3. Ciao! Finalmente un articolo che spieghi il funzionamento dei permalink!

    Ti volevo chiedere:

    Secondo te, la struttura:

    “anno – MESE – category – post” è ancora più efficiente di…

    “anno – category – post” ?

    Oppure è perfettamente inutile o addirittura controproducente?

    Ciao e grazie!

    • Dal punto di vista del database di wordpress non ci sono differenze in termini di efficienza: se c’è un numero (anno, in questo caso) all’inizio della struttura, è la soluzione migliore (sempre in termini di efficienza). Ovviamente te ne accorgi solo in determinate (poche) situazioni, come puoi capire dal grafico a fine articolo.

      • grazie mille!
        un’altra domanda se puoi.

        una volta che wordpress ha capito che non stai cercando pagine, l’indicazione della categoria lo aiuta a trovare prima il post con quel titolo, oppure perde tempo nuovamente a cercare un titolo con il nome della categoria…. e quando non l’ha trovato allora passa alla lista dei titoli veri e propri?

        • Se ti rileggi l’articolo, trovi la spiegazione ai tuoi dubbi. :)

          Comunque, l’indicazione della categoria o la sua omissione – a che ne so io – non aiuterebbe in termini di efficienza.

          Credo che la presenza della categoria, però, aiuti dal punto di vista SEO, su cui però sono ancora poco ferrato.

Lascia un commento