WordPress: come aggiungere o togliere categorie a tutti gli articoli Una serie di query MySQL per effettuare operazioni bulk di aggiunta e/o rimozione di categorie su WordPress agendo direttamente sul database

10 Must-Have features for a WordPress Website in 2019

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.

Wordpress: come aggiungere o togliere categorie a tutti gli articoli

Wordpress: come aggiungere o togliere categorie a tutti gli articoli

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:

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:

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:

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:

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:

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:

Per rimuovere l’associazione tra una  categoria  e tutti gli articoli associati a un’altra categoria:

Infine, per rimuovere l’associazione tra una  categoria  e tutti gli articoli NON associati a un’altra categoria:

Come si può vedere, le query di cui sopra contengono una sub-query ulteriore e apparentemente ridondante (SELECT * FROM wp_term_relationships invece di wp_term_relationships), resa necessaria per via di una nota limitazione di MySQL: per maggiori informazioni su questa problematica consigliamo di dare un’occhiata a questa risposta sul sito StackOverflow.

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!

 

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.