La gestion des mots-clefs dans Dotclear était un peu moins avancée que dans WordPress, mais elle avait deux avantages : il était facile de fusionner deux mots-clefs (il suffisait de les renommer à l’identique), et si un mot-clef n’était plus utilisé par aucun billet, il était supprimé de la base. Deux comportements que je n’ai pas retrouvés sous WordPress. Voici du coup quelques requêtes SQL qui peuvent aider à le faire.
La gestion des mots-clefs passe par 3 tables, comme je l’expliquais dans mon billet sur la migration des tags de Dotclear à WordPress.
Fusion de deux mot-clefs
On commence par récupérer le term_taxonomy_id de l’ancien mot-clef dans une variable @old, puis celui du nouveau mot-clefs dans une variable @new :
SELECT tt.term_taxonomy_id FROM wp_term_taxonomy tt, wp_terms t WHERE t.name = 'ancien mot' AND t.term_id = tt.term_id AND tt.taxonomy = 'post_tag' INTO @old; SELECT tt.term_taxonomy_id FROM wp_term_taxonomy tt, wp_terms t WHERE t.name = 'nouveau mot' AND t.term_id = tt.term_id AND tt.taxonomy = 'post_tag' INTO @new;
Ensuite, on met à jour la table wp_term_relationships en remplaçant les occurrences de l’ancien term_taxonomy_id par le nouveau :
UPDATE wp_term_relationships SET term_taxonomy_id = @new WHERE term_taxonomy_id = @old;
Et pour finir, on supprime l’ancien mot-clé de la base :
DELETE FROM wp_term_taxonomy WHERE term_id = @old; DELETE FROM wp_terms WHERE term_id = @old;
Purge de tous les mots-clefs non utilisés
On commence par supprimer toutes les entrées de wp_term_taxonomy pour lesquelles on ne trouve pas d’entrée de même term_taxonomy_id dans wp_term_relationships :
DELETE FROM wp_term_taxonomy WHERE NOT EXISTS ( SELECT 1 FROM wp_term_relationships tr WHERE wp_term_taxonomy.term_taxonomy_id = tr.term_taxonomy_id) AND taxonomy = "post_tag";
Ensuite on supprime toutes les entrées de wp_terms pour lesquelles on ne trouve pas d’entrée de même term_id dans wp_term_taxonomy :
DELETE FROM wp_terms WHERE NOT EXISTS ( SELECT 1 FROM wp_term_taxonomy tt WHERE wp_terms.term_id = tt.term_id);