In questo articolo cercherò di spiegare come effettuare una serie di operazioni sulle categorie di WordPress associate agli articoli utilizzando delle query SQL che agiscano direttamente sul database.
Le query di esempio che troverete pubblicate sono state scritte pensando a un database MySQL, ma dovrebbero funzionare - con alcune piccole modifiche - anche su qualsiasi altro DB Engine.
Operazioni preliminari
Inutile dire che, trattandosi di operazioni particolarmente delicate, è opportuno effettuare un backup completo di tutte le tabelle che andremo a modificare (o più semplicemente dell'intero database) prima di mettersi al lavoro, così da avere la possibilità di correggere immediatamente eventuali errori dovuti all'esecuzione di query errate o che non sortiscano l'effetto sperato.
Se avete bisogno di uno strumento per assolvere a tale scopo potete utilizzare SQLyog, una soluzione semplice e gratuita che consente di effettuare il backup di singole tabelle e/o di interi database tramite una pratica interfaccia utente e con pochi click. Questo strumento, disponibile sia in versione Windows che su Linux, consente anche di effettuare tramite GUI le query che andremo a illustrare nei paragrafi successivi.
In alternativa, potete utilizzare lo strumento mysqldump da linea di comando, seguendo le istruzioni descritte nella guida ufficiale.
Articoli, Categorie e Relazioni
Prima di dare un'occhiata alle query, è opportuno spendere qualche minuto per comprendere le modalità con cui WordPress organizza i vari articoli (post) e categorie (category) all'interno della propria base dati. Come probabilmente già sapete, il database utilizzato da WordPress è di tipo relazionale (RDBMS): nello specifico, l'associazione tra articoli e categorie è realizzata attraverso una relazione di tipo molti a molti (many-to-many); questo significa che ciascun articolo può essere associato a più categorie e che, viceversa, ciascuna categoria può essere associata a più articoli.
Per chi non lo sapesse, gli articoli sono memorizzati nella tabella wp_posts: questo significa che, per recuperare un articolo, occorre eseguire una query SQL di questo tipo:
1 |
SELECT * FROM wp_posts WHERE ID = @ID; |
Dove @ID, ovviamente, va sostituito con l'ID dell'articolo che vogliamo recuperare.
Per le categorie il discorso è leggermente più complesso: queste ultime vengono memorizzate come una tipologia particolare di oggetti, denominati terms, che si trovano nella tabella wp_terms; la definizione della tipologia di ciascun term, però, è memorizzata in una tabella diversa, ovvero wp_term_taxonomy. Questo significa che, per recuperare tutte le categorie, occorrerà fare una query SQL corredata da una istruzione JOIN nel seguente modo:
1 2 3 |
SELECT * FROM wp_terms JOIN wp_term_taxonomy ON wp_terms.term_id = wp_term_taxonomy.term_id WHERE wp_term_taxonomy.taxonomy = 'category'; |
Veniamo ora alla relazione molti a molti tra articoli e categorie: quest'ultima si trova nella cartella wp_term_relationships, che contiene il campo object_id (relativo all'articolo) e il term_taxonomy_id (relativo alla categoria). Questo significa che, per recuperare tutte le categorie associate a un dato articolo di cui abbiamo l'ID, occorrerà fare una query SQL di questo tipo:
1 2 3 4 |
SELECT * FROM wp_term_relationships tr JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN wp_terms t ON t.term_id = tt.term_id WHERE tr.object_id = @PostID AND tt.taxonomy = 'category' |
Sostituendo ovviamente il placeholder @PostID con il post_id dell'articolo.
Tutto chiaro? Mi auguro di si. Nei prossimi paragrafi vedremo come sarà possibile utilizzare queste informazioni per effettuare una serie di operazioni bulk sui nostri dati.
Aggiungere una categoria a tutti gli articoli
Ipotizziamo di aver appena creato una categoria "News" e di volerla aggiungere a tutti gli articoli: ovviamente potremmo utilizzare l'interfaccia utente offerta dal pannello di amministrazione di WordPress, ma nell'ipotesi in cui avessimo a disposizione un numero di articoli molto elevato questa soluzione potrebbe non essere ottimale.
Ecco come possiamo risolvere il problema con una query SQL:
1 2 3 4 5 |
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order) SELECT ID, @CategoryID, 0 FROM wp_posts p WHERE p.post_type = 'post' AND p.ID NOT IN (SELECT object_id FROM wp_term_relationships tr3 WHERE tr3.term_taxonomy_id = @CategoryID); |
La query di cui sopra funziona in modo piuttosto semplice: inserisce all'interno della tabella wp_term_relationships (che ospita, come sappiamo, le relazioni tra articoli e categorie) una riga per cascun articolo, impostando l'ID dell'articolo come object_id e l'ID della nuova categoria come term_taxonomy_id. E' importante notare come la query contempli anche una condizione NOT IN, necessaria per "saltare" dall'operazione eventuali articoli già associati alla nuova categoria, in modo da evitare eventuali errori e/o relazioni duplicate.
Ovviamente, al posto di @CategoryID dovremo inserire l'ID della categoria creata.
Aggiungere una categoria aggiuntiva agli articoli che ne hanno già una
Vediamo ora come aggiungere una categoria ulteriore a tutti gli articoli che hanno già una categoria esistente. Per fare una cosa del genere è necessario eseguire la seguente query SQL:
1 2 3 4 5 |
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order) SELECT object_id, @CategoryID, 0 FROM wp_term_relationships tr2 WHERE tr2.term_taxonomy_id = @OldCategoryID AND object_id NOT IN (SELECT object_id FROM wp_term_relationships tr3 WHERE tr3.term_taxonomy_id = @CategoryID); |
Al posto di @CategoryID dovremo inserire l'ID della categoria aggiuntiva, mentre al posto di @OldCategoryID andrà utilizzato l'ID della categoria già presente.
Come possiamo vedere la query è piuttosto simile alla precedente, con una differenza sostanziale: gli ID degli articoli ai quali associare la nuova categoria non vengono presi dalla tabella wp_post ma direttamente dalla tabella wp_term_relationships, visto che sono necessariamente presenti lì (in quanto ci interessano solo se associati alla vecchia categoria). Dai record ottenuti in questo modo è possibile recuperare l'object_id, necessario per creare la nuova relazione con la categoria aggiuntiva.
Rimuovere una categoria
Vediamo ora le query che ci consentiranno di rimuovere l'associazione tra una categoria e uno o più articoli in base ai medesimi criteri di cui sopra, una volta recuperato il suo ID:
Per rimuovere l'associazione tra una categoria e tutti gli articoli:
1 |
DELETE FROM wp_term_relationships WHERE term_taxonomy_id = @CategoryID; |
Per rimuovere l'associazione tra una categoria e tutti gli articoli associati a un'altra categoria:
1 2 3 4 5 |
DELETE FROM wp_term_relationships WHERE term_taxonomy_id = @CategoryID AND object_id IN (SELECT object_id FROM (SELECT * FROM wp_term_relationships) AS tr2 WHERE tr2.term_taxonomy_id = @OtherCategoryID); |
Infine, per rimuovere l'associazione tra una categoria e tutti gli articoli NON associati a un'altra categoria:
1 2 3 4 5 |
DELETE FROM wp_term_relationships WHERE term_taxonomy_id = @CategoryID AND object_id NOT IN (SELECT object_id FROM (SELECT * FROM wp_term_relationships) AS tr2 WHERE tr2.term_taxonomy_id = @OtherCategoryID); |
Conclusioni
Per il momento è tutto: ci auguriamo che questo breve tutorial possa esservi di aiuto per effettuare operazioni bulk sugli articoli e/o sulle categorie del vostro sito WordPress in modo semplice e veloce!