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 scritto:

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

  2. ha scritto:

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

  3. camu
    ha scritto:

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

  4. ha scritto:

    Ok, ora ho beccato 3 record. Posso eliminarli tranquillamente? πŸ˜‰
    Ciao,
    Emanuele

  5. camu
    ha scritto:

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

    Risposte al commento di camu

    1. ha scritto:

      @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 scritto:

    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 scritto:

    @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 scritto:

    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 scritto:

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

    Risposte al commento di affiliazioni

    1. camu
      ha scritto:

      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 scritto:

    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 scritto:

    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 scritto:

    @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 scritto:

    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 scritto:

    @Paolo: uno è lieto di poter aiutare.

  15. Francesco
    ha scritto:

    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!

    Risposte al commento di Francesco

    1. camu
      ha scritto:

      @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 scritto:

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

    Risposte al commento di Francesco

    1. camu
      ha scritto:

      @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 scritto:

    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!

    Risposte al commento di Francesco

    1. Francesco
      ha scritto:

      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 scritto:

      @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 scritto:

    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 );define(‘WP_POST_REVISIONS’, 3);

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

    Risposte al commento di Francesco

    1. camu
      ha scritto:

      @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 scritto:

    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. […] trovato molto utile l’articolo in questo link due chiacchiere. Spiega come cancellare le revisioni in WordPress utlizzando un comando sql che riporto […]

  21. giulio
    ha scritto:

    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

    Risposte al commento di giulio

    1. camu
      ha scritto:

      @giulio: si, mi pare sia l’approccio giusto, grazie per la precisazione πŸ™‚

  22. Francesco
    ha scritto:

    Quindi alla fine che cosa dobbiamo usare? πŸ™‚

    Risposte al commento di Francesco

    1. camu
      ha scritto:

      @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 πŸ™‚

  23. Reyboz Blog
    ha scritto:

    Il database del nostro blog ringrazia di cuore πŸ˜€ Ha perso qualche chiletto…

    Risposte al commento di Reyboz Blog

    1. camu
      ha scritto:

      Non è mai troppo tardi per una bella cura dimagrante πŸ™‚ lieto di esservi stato utile…

  24. Lionard
    ha scritto:

    A me non funziona πŸ™ dice che non esiste wp_postmeta ma perchè?
    Grazie

    Risposte al commento di Lionard

    1. camu
      ha scritto:

      @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?

  25. lionard
    ha scritto:

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

    Delete for Michaels query (untested).

    (DELETE rimosse da camu)

    Risposte al commento di lionard

    1. camu
      ha scritto:

      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.

  26. Lionard
    ha scritto:

    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

  27. Lionard
    ha scritto:

    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

    Risposte al commento di Lionard

    1. camu
      ha scritto:

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

  28. Lionard
    ha scritto:

    Gazie infinite! Ha funzionato.

  29. Paolo
    ha scritto:

    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! πŸ˜€

    Risposte al commento di Paolo

    1. camu
      ha scritto:

      @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…

  30. Francesco Celiento
    ha scritto:

    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 πŸ™‚

    Risposte al commento di Francesco Celiento

    1. camu
      ha scritto:

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

  31. walter
    ha scritto:

    grazie,
    preciso, chiaro ed efficace!

Rispondi a giulio

Torna in cima alla pagina