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

46
Lascia una recensione

Please Login to comment
13 Comment authors
PietrowalterFrancesco CelientoPaoloLionard Recent comment authors
  Subscribe  
più nuovi più vecchi più votati
Notificami
FulviaLeopardi
Ospite

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

Emanuele
Ospite

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

Emanuele
Ospite

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

Lolindir Faelivrin
Ospite

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!

Lolindir Faelivrin
Ospite

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

affiliazioni
Ospite
affiliazioni

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

affiliazioni
Ospite
affiliazioni

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.

affiliazioni
Ospite
affiliazioni

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

Paolo
Ospite

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 😉

Francesco
Ospite
Francesco

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!

camu
Ospite
camu

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

Francesco
Ospite
Francesco

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

Francesco
Ospite
Francesco

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!

Francesco
Ospite
Francesco

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?

Francesco
Ospite
Francesco

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.

Francesco
Ospite
Francesco

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.

trackback

[…] trovato molto utile l’articolo in questo link due chiacchiere. Spiega come cancellare le revisioni in WordPress utlizzando un comando sql che riporto […]

giulio
Ospite
giulio

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

Francesco
Ospite
Francesco

Quindi alla fine che cosa dobbiamo usare? 🙂

camu
Ospite
camu

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

Reyboz Blog
Ospite
Reyboz Blog

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

Lionard
Ospite
Lionard

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

lionard
Ospite
lionard

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

Delete for Michaels query (untested).

(DELETE rimosse da camu)

Lionard
Ospite
Lionard

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

Lionard
Ospite
Lionard

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

Lionard
Ospite
Lionard

Gazie infinite! Ha funzionato.

Paolo
Ospite

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! 😀

Francesco Celiento
Ospite

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 🙂

walter
Ospite
walter

grazie,
preciso, chiaro ed efficace!