RSS Contattami

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? :)

[RSS] Commenti

  • Avatar di FulviaLeopardi

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

  • Avatar di Emanuele

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

  • camu

    @FulviaLeopardi: puoi sempre scegliere un altro tema :)
    @Emanuele: hai ragione, i campi da selezionare non sono p.ID e p.post_title, ma quelli dell’altra tabella… correggo subito :)

  • Avatar di Emanuele

    Ok, ora ho beccato 3 record. Posso eliminarli tranquillamente? ;-)
    Ciao,
    Emanuele

  • camu

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

  • Avatar di Lolindir Faelivrin

    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!

  • camu

    @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ù ;)

  • Avatar di Lolindir Faelivrin

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

  • Avatar di affiliazioni

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

    • camu

      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!

  • Avatar di 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.

  • Avatar di affiliazioni

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

  • camu

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

  • Avatar di Paolo

    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 ;)

  • camu

    @Paolo: uno è lieto di poter aiutare.

  • Avatar di 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

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

  • Avatar di Francesco

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

    • camu

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

  • Avatar di Francesco

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

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

    Grazie!

    • Avatar 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?

    • camu

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

  • Avatar di 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.

    • camu

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

  • Avatar di 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.

  • anonimo

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

  • anonimo

    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

  • Avatar di Francesco

    Quindi alla fine che cosa dobbiamo usare? :)

    • 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 :)

  • Avatar di Reyboz Blog

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

  • Avatar di Lionard

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

    • camu

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

  • Avatar di lionard

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

    Delete for Michaels query (untested).

    (DELETE rimosse da camu)

    • camu

      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.

  • Avatar di 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

  • Avatar di 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

    • camu

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

  • Avatar di Lionard

    Gazie infinite! Ha funzionato.

  • Avatar di Paolo

    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! :D

    • camu

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

  • Avatar di Francesco Celiento

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

Modulo per l'invio di un commento

Lascia un commento

, oppure iscrivimi senza commentare.