WordPress : fusionner des mots-clefs et purger les mots clés inutilisés

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);

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.