Migration des tags Dotclear vers WordPress

Il y a quelques jours, je vous ai expliqué comment je m’y suis pris pour migrer mon blog Dotclear vers WordPress et mettre en place une redirection des anciennes URL vers les nouvelles. Une solution relativement simple, s’appuyant sur des plug-ins existants pour WordPress et sur quelques lignes de PHP. Avec tout de même un défaut, auquel j’ai remédié ce week-end : les mots-clefs n’étaient pas migrés. C’est désormais chose faite.

N’ayant pas trouvé de solution clé en main pour effectuer cette migration, j’ai décidé d’en faire une moi même, ce qui est en fait relativement simple, même si la structure de base de WordPress est un poil plus complexe que celle de Dotclear.

Côté Dotclear, c’est simple, voir simpliste : une unique table meta contient des triplets composés de l’ID de la méta-donnée (qui est le mot-clé lui même dans notre cas), du type de la méta-donnée et de l’ID du billet auquel elle est associée. Par exemple, si le billet numéro 912 a le tag mot-clé adsl, on va trouver une ligne (‘adsl’, ‘tag’, 912) dans la table meta.

Côté WordPress, il y a une distinction entre le stockage des mots-clés et leur association à des articles. Le mécanisme s’appuie sur trois tables différentes :

  • terms qui contient les mots-clés, leur slug (l’identifiant pour les reconnaitre dans l’URL), leur groupe (pas cherché à comprendre ce que c’est ^^) et un term_id unique,
  • term_taxonomy qui associe un term_id avec une taxonomie (type de terme, par exemple post_tag pour un tag, category pour une catégorie), un term_taxonomy_id unique, une description et un parent optionnel, et un compteur d’occurences,
  • term_relationships qui associe un term_taxonomy_id avec un ID d’article.

Si l’article numéro 912 a le mot-clé adsl (et est le seul à l’avoir), on va trouver une entrée (x, ‘adsl’, ‘adsl’, 0) dans la table terms, une entrée (y, x, ‘post_tag’,  », 0, 1) dans term_taxonomy et (912, y, 0) dans term_relationships.

De ces structures découle donc l’algorithme de migration suivant :

  1. récupérer l’ensemble des mots-clés et la liste des billets associés dans la base Dotclear,
  2. insérer les mots-clés dans la base WordPress (tables terms et term_taxonomy),
  3. récupérer les term_taxonomy_id des mots-clés,
  4. faire la correspondance entre les id des billets Dotclear et ceux des articles WordPress,
  5. pour chaque mot-clé récupéré à l’étape 1, prendre son term_taxonomy_id trouvé à l’étape 3 et la liste des id d’articles trouvée à l’étape 4 pour insérer les entrées correspondantes dans term_relationships,
  6. mettre à jour le champ count de term_taxonomy en fonction du nombre d’enregistrements correspondants dans term_relationships.

Traduit en PHP, ça donne quelque choses comme ça :

Si la migration de certains mots clés échoue (ce qui peut arriver notamment si le slug est déjà utilisé pour une catégorie, ce cas n’étant pas pris en compte dans le code), un message s’affiche, listant les id des billets correspondant, ce qui permettra de traiter manuellement les cas non traités automatiquement.

J’ai également mis à jour le script de redirection pour gérer la redirection des pages de mots clés et de catégories :

4 réflexions sur « Migration des tags Dotclear vers WordPress »

  1. MErci pour ce script
    je l’ai un peu modifié car il y avait quelques bugs
    mais au final, cela ne marche pas non plus..
    il n’arrive pas à associer les etiquettes et les posts
    de plus, les slugs ne sont pas correctement insérés non plus

    et la j’avoue que mes connaissances php ne suffisent pas.. 🙁

    1. Ça avait bien fonctionné à l’époque pour la migration d’Infobidouille, mais depuis le temps c’est possible que les évolutions respectives de Dotclear et de WordPress aient rendu ce script inutilisable 🙁

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.