Infobidouille

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 :

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 :