due chiacchiere

Cancellare le revisioni in WordPress

Da un annetto a questa parte, se la memoria non m’inganna, esiste in WordPress il salvataggio automatico degli articoli, che evita di perdere tanto lavoro prezioso in caso di problemi con il computer. L’effetto collaterale di questa bella trovata è il sovraffollamento del database dove vengono memorizzati i contenuti. Non esiste, infatti, un modo per cancellare le revisioni (così sono chiamate le varie versioni di un articolo salvate nel tempo) direttamente dal pannello di controllo. I più smaliziati sanno che esiste un parametro per disattivare o limitare questa funzionalità, define('WP_POST_REVISIONS', 0) da impostare nel wp-config.php. Ma anche così facendo, almeno una revisione per ogni articolo viene comunque salvata dal sistema.

Finisce così che, con il passare del tempo, si accumulano nel database un sacco di revisioni inutili: una volta pubblicato l’articolo “buono”, difficilmente servirà ripristinare una sua versione precedente. Specialmente se sei uno di quei blogger che pubblicano a raffica articoli uno dopo l’altro! La soluzione “manuale” che ti propongo io, consiste nell’entrare nel tuo gestore Mysql (in genere phpmyadmin) ed eseguire questo comando:

DELETE p,tr,pm
FROM wp_posts p
LEFT JOIN wp_term_relationships tr ON p.ID = tr.object_id
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'revision'

Diffida da chi dice che basta cancellare soltanto gli articoli dalla tabella wp_posts, perché non conosce la struttura di relazioni che gli sviluppatori hanno creato. Di fatto, pulendo solo quella tabella, farai ancora più casino, lasciando un bel mucchio di relazioni spezzate. Se vuoi, puoi sapere se il tuo database contiene questo genere di orfani:

SELECT tr.object_id, tr.term_taxonomy_id
FROM wp_term_relationships tr LEFT JOIN wp_posts p
ON p.ID = tr.object_id
WHERE p.post_title is NULL

Questa interrogazione restituisce tutte le righe orfane nella tabella wp_term_relationships, cioè quelle a cui non corrisponde più nessun articolo. Analoga ricerca bisognerebbe fare con wp_postmeta: in entrambi i casi queste righe possono essere cancellate dalla base di dati.

P.S.: si vede che sto facendo le pulizie autunnali sul blog, eh? 🙂

Commenti

  1. FulviaLeopardi ha detto:

    ‘sto tema marroncino è brutto …vabbé che è autunno, ma…ALLEGRIA!!

  2. Emanuele ha detto:

    Mmm… con la seconda query ricevo 3 record NULL… è normale?
    Ciao,
    Emanuele

  3. camu ha detto:

    @Emanuele: hai ragione, i campi da selezionare non sono p.ID e p.post_title, ma quelli dell’altra tabella… correggo subito 🙂

  4. Emanuele ha detto:

    Ok, ora ho beccato 3 record. Posso eliminarli tranquillamente? 😉
    Ciao,
    Emanuele

  5. camu ha detto:

    @Emanuele: direi di si, ma per fare la prova del “nove” puoi vedere se nella tabella wp_posts hai articoli il cui ID corrisponde all’object_id che ottieni dalla query. Se tutto è come dovrebbe essere, non dovresti avere articoli 🙂 A quel punto puoi tranquillamente ranzare le tre righe!

    Giusto per andare un po’ più sul tecnico, la tabella dove hai trovato le tre righe serve per esprimere una relazione “molti a molti” tra articoli e categorie; probabilmente hai cancellato i tre articoli in questione, ma non la relazione che essi avevano con tag e categorie del tuo blog.

    1. Pietro ha detto:

      @camu:
      Salve, molto utile questo tuo post…ti seuirò!
      Ho bisogno di una spiegazione. Sul mi database che contiene circa 700 post ho trovato 9 record.
      Come faccio….praticamente a sapere se sono cancellabili oppure no.

      Ho provato ad aprirli usando modifica e sono vuoti,
      Grazie per il supporto

  6. Lolindir Faelivrin ha detto:

    Ottimo consiglio per tutti quelli che usano WordPress, cmq esiste un plug-in che fa la stessa cosa e ti segnala anche quante revisioni hai, non mi pare però che controlli se ci sono orfani!

  7. camu ha detto:

    @Lolindir Faelivrin: vero, l’avevo trovato anche io, ma è compatibile (ufficialmente) fino alla versione 2.7.1 di WordPress, e così non fidandomi, mi sono rimboccato le maniche e ho scritto qualcosa che facesse direttamente al caso mio. Tra l’altro sto facendo grosse pulizie in casa (per far contento Google Webmaster Tools che trova link rotti un po’ in giro) e mi sono scritto una funzione che mi controlla se ho collegamenti interni a pagine (interne) che non esistono più 😉

  8. Lolindir Faelivrin ha detto:

    Ecco, ero sicuro che non ti fosse sfuggito il plug-in, bhe alla fine fare tutto a mano da le sue soddisfazioni!

  9. affiliazioni ha detto:

    Io utilizzo il plugin per wordpress ” delete-revision” . Non è piu’ semplice?

    1. camu ha detto:

      Non lo conoscevo, ma vedo che il sito dell’autore è tutto in Giapponese 🙂 Non ci si capisce nulla… Comunque una cosa che il plugin non fa è trovare gli orfani nelle tabelle collegate, almeno così mi pare di capire. Certo rimane un’ottima soluzione per chi non ha voglia di aprire il cofano di wordpress!

  10. affiliazioni ha detto:

    Si il sito dell’autore è giapponese, ma ti posso assicurare che funziona benissimo! Io eseguo sul mio blog la pulitura una volta al mese, e mi elimina circa 500 salvataggi alla volta. Naturalmente è una comoda utility per noi non esperti.

  11. affiliazioni ha detto:

    Ti volevo chiedere una cosa OT, cosa posso fare per velocizzare il caricamento delle pagine del blog? Mi puoi essere di aiuto?

  12. camu ha detto:

    @affiliazioni: beh, ma allora puoi disattivare le revisioni alla radice, così il problema è molto meno “importante” (500 salvataggi al mese non è tanto, ma è un bel po’ di roba) 😉 Riguardo al velocizzare il blog, ci sono tre cose su cui mi concentrerei: pochi plugin, ottimizzazione del template, uso di wp-super-cache.

  13. Paolo ha detto:

    Grazie: col tuo post mi hai più che dimezzato il db ed al tempo stesso hai fatto felice la mia pigrizia, evitandomi di rimboccarmi le maniche 😉

  14. camu ha detto:

    @Paolo: uno è lieto di poter aiutare.

  15. Francesco ha detto:

    Ciao camu, grazie per il post.

    Se lancio la query per cancellare le revisioni e dopo lancio quella per controllare che hai messo in basso, non dovrebbe restituirmi nessuna riga?
    (non sono un esperto ovviamente)

    Volevo inoltre sapere la differenza tra la tua e quella trovata online, ossia:
    DELETE a,b,c
    FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
    WHERE a.post_type = ‘revision’

    Grazie!

    1. camu ha detto:

      @Francesco: esatto, dovrebbe ritornarti un insieme vuoto. In merito alle differenze, le due query sono semanticamente indentiche, cambiano solo i nomi delle variabili. Loro hanno usato a,b,c, io ho cercato di usare qualcosa di più significativo 😀

  16. Francesco ha detto:

    @camu: A me tornano invece delle righe credo. Ho fatto un’immagine: http://b.imagehost.org/0096/1_19.jpg

    1. camu ha detto:

      @Francesco: cancellale pure, sono righe “orfane”. Per fare la prova del nove, controlla che non esistano post che hanno ID uguale al valore della prima colonna 🙂

  17. Francesco ha detto:

    Effettivamente sembrano non corrispondere a ID di articoli.
    Mi terrorizza vedere che ci sono 92 pagine di quella roba 😀

    C’è un modo per farle fuori tutte in una volta?

    Grazie!

    1. Francesco ha detto:

      Ne sto approfittando troppo, ma le tue parole mi danno fiducia mentre si affrontano cose delicate come i database 🙂

      Il comando “Ottimizza Tabella” di phpmyadmin è sicuro? Va bene usarlo ogni tanto?

    2. camu ha detto:

      @Francesco: 92 pagine?!?! Uhm, c’è qualcosa che non funziona a dovere nel tuo blog allora. Prima di fare piazza pulita, prova magari a sentire gli sviluppatori di WordPress a questo punto 🙂 In genere dovrebbero esserci non più di una manciata di righe… ma il tuo è un caso grave e non posso che mandarti dallo specialista eheh. Riguardo all’ottimizza tabella, si, è sicuro e consiglio di usarlo periodicamente. In pratica compatta i record e rimuove “buchi” dovuti a frequenti cancellazioni di righe…

  18. Francesco ha detto:

    Sì, 92 pagine proprio.
    Considera che sono più di 350 articoli e ognuno di questi aveva un mare di revisioni. Forse è questo il motivo di tutte quelle righe residue.

    Non c’è un modo per limitare il numero di revisioni per post? Online (http://goo.gl/1gq5O) ho trovato queste righe:
    define(‘WP_POST_REVISIONS’, false ); // disable post revisions
    define(‘WP_POST_REVISIONS’, 3); // alter number of post revisions kept.

    Non capisco se devo metterle entrambe, a me sembra che vadano in contrasto.

    1. camu ha detto:

      @Francesco: si, sono in “contrasto”, la prima dice di disabilitare completamente le revisioni in WordPress (in realtà una viene comunque salvata, per le bozze) e la seconda dice di mantenere solo 3 revisioni, non una di più 😉 Dipende dalle tue esigenze… Il fatto che tu abbia 92 pagine di orfani vuol dire che avevi eseguito una query diversa per cancellare le revisioni, perché la mia dovrebbe prendersi cura di non lasciare schifezze in giro e orfani vari 🙁

  19. Francesco ha detto:

    Sì, in passato avevo lanciato una query che, se ricordo bene, agiva solo nella tabella wp_post.
    Poco fa ho lanciato la tua sul DB originale e mi ha fatto fuori 2499 righe. Devo vedere ora cosa fare con le 92 pagine che rimangono.

  20. giulio ha detto:

    Su wp_postmeta avrei usato:

    SELECT tr.meta_key, tr.meta_value
    FROM wp_postmeta tr LEFT JOIN wp_posts p
    ON p.ID = tr.post_id
    WHERE p.post_title is NULL

    1. camu ha detto:

      @giulio: si, mi pare sia l’approccio giusto, grazie per la precisazione 🙂

  21. Francesco ha detto:

    Quindi alla fine che cosa dobbiamo usare? 🙂

    1. camu ha detto:

      @Francesco: la stringa SQL proposta da Giulio serve soltanto a verificare che la DELETE proposta nel mio articolo abbia sortito l’effetto desiderato. Un po’ la prova del nove per assicurarsi che tutto sia andato a buon fine. Questga stringa SQL può essere usata in congiunzione con quella (SELECT) proposta nell’articolo. Grazie per avermi chiesto di precisare 🙂

  22. Reyboz Blog ha detto:

    Il database del nostro blog ringrazia di cuore 😀 Ha perso qualche chiletto…

    1. camu ha detto:

      Non è mai troppo tardi per una bella cura dimagrante 🙂 lieto di esservi stato utile…

  23. Lionard ha detto:

    A me non funziona 🙁 dice che non esiste wp_postmeta ma perchè?
    Grazie

    1. camu ha detto:

      @Lionard: che versione di WordPress hai sul tuo blog? Stai usando per caso una struttura multisito? Forse hai chiamato le tue tabelle con un prefisso diverso da wp?

  24. lionard ha detto:

    Inoltre in rete ho trovato questa (non so se faccia la stessa cosa)

    Delete for Michaels query (untested).

    (DELETE rimosse da camu)

    1. camu ha detto:

      Lionard, ho rimosso le query che avevi inserito nel commento per non creare confusione negli altri lettori che dovessero arrivare su questa pagina. Ho appena verificato la struttura del database di WordPress 3.1, e confermo che le query originali nel mio articolo sono ancora valide e funzionanti.

  25. Lionard ha detto:

    Ciao, uso WordPress 3.0, più precisamente mi dice:

    ” #1146 – Table ‘Sql241705_1.wp_posts’ doesn’t exist ” con il punto esclamativo rosso.

    DELETE p,
    tr,
    pm FROM wp_posts p LEFT JOIN wp_term_relationships tr ON p.ID = tr.object_id LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = ‘revision’

    Grazie e ciao

  26. Lionard ha detto:

    Controllando meglio ho notato che al posto di wp_post ho il nome Toscana (non mi ricordo perchè). Mi sapresti dire il comando da inviare in questo caso?
    Grazie

    1. camu ha detto:

      Ecco, allora ti basta sostituire wp_ con toscana_: wp_posts diventa toscana_posts, e via dicendo.

  27. Lionard ha detto:

    Gazie infinite! Ha funzionato.

  28. Paolo ha detto:

    Grazie mille! Articolo utile e interessante. Tra l’altro mi complimento per il tuo modo di trattare le diverse argomentazioni, sorprendentemente semplice e divertente. Fantastico! 😀

    1. camu ha detto:

      @Paolo: grazie 🙂 Diciamo che la semplicità fa parte della “linea editoriale” di questo blog da quand’è nato. La roba tecnica è noiosa per colpa di chi non la sa spiegare bene…

  29. Francesco Celiento ha detto:

    Grazie mille, avevo deciso di lavorare anch’io su quella query del genere, per fortuna che ho il vizio di cercare su google prima di mettermi al lavoro 🙂

    1. camu ha detto:

      @Francesco Celiento: direi che questo è uno dei pochi vizi che non dovresti mai perdere!

  30. walter ha detto:

    grazie,
    preciso, chiaro ed efficace!

Lascia un commento