WordPress: manutenzione straordinaria

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 campo term_taxonomy_id è la chiave primaria della tabella ed è usato come chiave esterna nella tabella wp_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 :)

Articolo pubblicato in Tips & Tricks, Wordpress. Aggiungi il permalink ai segnalibri. Segui i commenti a questo articolo con il suo Feed RSS. Post a comment or leave a trackback: Trackback URL.