In questi giorni ho avuto la necessità di rimuovere in massa un numero notevole di articoli da un’installazione di WordPress e di doverlo fare “sporcandomi le mani” all’interno del database, dato che per qualche motivo il pannello di amministrazione non voleva saperne di funzionare. Condivido qui di seguito la soluzione che ho trovato in caso servisse a qualcuno, ma anche nel caso in cui qualche collega conosca una soluzione migliore per il futuro.
Situazione iniziale
Obiettivo: cancellare da un’installazione di WordPress 2.6.3 tutti i post appartenenti alla categoria ‘Musica’ o ad una delle sue sotto-categorie.
Problema: il pannello di amministrazione causa diversi errori anche dopo avere disabilitato tutti i plugin, ma non c’è il tempo necessario per andare a caccia della causa.
Nota: i parametri relativi all’installazione specifica di WordPress non sono quelli esposti in questo esempio. Per comodità assumerò ‘Musica’ come categoria base, al cui ID nel database assegno il valore arbitrario “100”, utilizzando il prefisso di default “wp_” per le tabelle del database.
Premessa tecnica: gestione delle tassonomie in WordPress
WordPress gestisce le categorie e i tag utilizzando 3 tabelle:
wp_terms- Contiene i nomi di categorie e tag tutti insieme.
wp_term_taxonomy- Contiene i dettagli sui termini, cioè se un termine è un nome di categoria
(category), un tag applicato a un post (post_tag), una categoria di link
(link_category), ecc e il collegamento con il suo genitore (parent).
Il campoterm_taxonomy_idè la chiave primaria della tabella ed è usato come chiave esterna nella tabellawp_term_relationships. wp_term_relationships- Contiene le relazioni tra i termini (
term_taxonomy_id) e gli oggetti associati (object_id), post o link.
Passo 1: troviamo tutti i termini collegati alla categoria madre
Nella tabella wp_terms il termine “Musica” ha term_id=100. Per avere una lista dei termini associati la query da eseguire è:
[code lang="sql" light="true"]SELECT * FROM wp_term_taxonomy WHERE term_id = 100 OR parent = 100[/code]
Per utilizzarla nel passo successivo però ci serve solo la chiave, quindi eseguiremo:
[code lang="sql" light="true"]SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id =100 OR parent =100[/code]
Passo 2: selezioniamo gli ID dei post che ci interessano
Il campo che collega le tabelle wp_term_relationships e wp_term_taxonomy è term_taxonomy_id, quindi ho usato 2 query annidate per avere tutti i dati in un passaggio solo:
SELECT object_id FROM <code>wp_term_relationships</code> WHERE <code>term_taxonomy_id</code> IN ( SELECT term_taxonomy_id FROM <code>wp_term_taxonomy</code> WHERE term_id =100 OR parent =100 )
Questa query recupera gli ID di tutti i post appartenenti alle categorie interessate e sarà utilizzata nel prossimo passo.
Passo 3: applichiamo il risultato
Per selezionare i post che mi interessano interrogo la tabella wp_posts inserendo le due query ricavate in precedenza nella condizione WHERE.
SELECT * FROM wp_posts WHERE ID IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN ( SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id =100 OR parent =100 ) )
Sostituendo DELETE al primo SELECT * cancello i post selezionati in precedenza, ma è sempre meglio controllare prima i dati!
Passo 4: pulizia
Una volta cancellati i post bisogna eliminare anche i loro riferimenti rimasti nella tabella `wp_term_relationships, che ci sono stati utili, ma ora non servono più.
Eseguirò quindi la query composta del punto 2 sostituendo DELETE al primo SELECT *.
E questo è tutto, ora mi posso dedicare con calma a capire perchè il pannello di amministrazione non funziona, ma questa è un’altra storia
