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
‘sto tema marroncino è brutto …vabbé che è autunno, ma…ALLEGRIA!!
Mmm… con la seconda query ricevo 3 record NULL… è normale?
Ciao,
Emanuele
@Emanuele: hai ragione, i campi da selezionare non sono p.ID e p.post_title, ma quelli dell’altra tabella… correggo subito π
Ok, ora ho beccato 3 record. Posso eliminarli tranquillamente? π
Ciao,
Emanuele
@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
@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
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: 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ù π
Ecco, ero sicuro che non ti fosse sfuggito il plug-in, bhe alla fine fare tutto a mano da le sue soddisfazioni!
Io utilizzo il plugin per wordpress ” delete-revision” . Non è piu’ semplice?
Risposte al commento di affiliazioni
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!
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.
Ti volevo chiedere una cosa OT, cosa posso fare per velocizzare il caricamento delle pagine del blog? Mi puoi essere di aiuto?
@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.
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 π
@Paolo: uno è lieto di poter aiutare.
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
@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 π
@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
@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 π
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
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: 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…
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
@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 π
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.
[…] trovato molto utile l’articolo in questo link due chiacchiere. Spiega come cancellare le revisioni in WordPress utlizzando un comando sql che riporto […]
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
@giulio: si, mi pare sia l’approccio giusto, grazie per la precisazione π
Quindi alla fine che cosa dobbiamo usare? π
Risposte al commento di Francesco
@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 π
Il database del nostro blog ringrazia di cuore π Ha perso qualche chiletto…
Risposte al commento di Reyboz Blog
Non è mai troppo tardi per una bella cura dimagrante π lieto di esservi stato utile…
A me non funziona π dice che non esiste wp_postmeta ma perchè?
Grazie
Risposte al commento di Lionard
@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?
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
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.
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
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
Ecco, allora ti basta sostituire
wp_
contoscana_
: wp_posts diventa toscana_posts, e via dicendo.Gazie infinite! Ha funzionato.
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
@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…
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
@Francesco Celiento: direi che questo è uno dei pochi vizi che non dovresti mai perdere!
grazie,
preciso, chiaro ed efficace!