WordPress: migration d’une base de données iso-8859-15 au format UTF-8

Modifications

Après avoir joué avec WordPress 2.0.4 pour le compte du Centre de Kriya Yoga France et questionné à ce sujet par creatix, je me suis mis en tête de mettre le blog à jour.

Mais quitte à mettre à jour, autant le faire proprement, c’est à dire de manière pérenne.

J’ai donc étudié les nouvelles fonctions apportées par WP2+ et j’ai pu me défaire d’au moins 5 ou 6 plugins dont les fonctions sont maintenant inclues par défaut dans WordPress.

Mais ce n’est pas tout : ma base de données WP 1.5+ était encodée en iso-8859-15 (caractères de l’Europe de l’Ouest, avec le symbole Euro), ce qui était bien en 2004 mais qui ne l’est plus en 2006. Hé oui, les temps changent et les encodages de caractères avec eux !

Place donc à l’UTF-8, un codage qui se veut universel (il permet de représenter des milliers de caractères de toutes sortes de langues, dont l’ensemble des caractères spécifiques français), compatible (un texte en US-ASCII est codé identiquement en UTF-8) et visant l’interopérabilité (chaque caractère est codé sur une suite de un à quatre octets.

UTF-8 a été conçu pour être compatible avec certains logiciels originellement prévus pour traiter des caractères d’un seul octet).

Migration de la base de données iso-8859-15 en UTF-8

Le plus délicat est de convertir les données iso-8859-15 accentuées en données UTF-8 avec les différents accents codés sur les fameux 4 octets.

Pour effectuer cette conversion, voici les étapes que j’ai fini par trouver, après plusieurs exports/imports de ma base.

Exportez votre base au format gzip.

Créez une nouvelle base sans aucun interclassement.

Si vous utilisez PHPmyadmin, importez votre base de l’étape 1 en sélectionnant “jeu de caractères : binaire” lors de l’import. C’est ce qui transforme nos fameux accents en caractères codés.

Si vous utilisez MySQLFront, importez le fichier .sql de votre base en mode ASCII dans la nouvelle base de données.

Voilà, les données de votre base sont normalement en UTF-8 ! :-). Notez que vos fichiers de thèmes devront probablement être modifiés à cause des accents.

J’ai essayé plusieurs manière d’uploader le fichier : en mode UTF-8, en mode binaire, en mode ASCII et je crois que c’est ce dernier qui a finalement fonctionné comme attendu.

A vrai dire, cela m’a quasiment pris une journée mais au final je suis content d’avoir migré cette base. Mieux vaut le faire lorsqu’elle pèse 5 Mo plutôt que dans quelques années lorsqu’elle en fera 50…

Régler l’erreur “capabilities.php on line 19”

Petite surprise une fois la migration effectuée : je suis tombé sur l’erreur suivante, inconnue du bataillon :

Warning: Invalid argument supplied for foreach() in /home/mjbiscay/public_html/wp2/wp-includes/capabilities.php on line 19

Cette jolie erreur est un petit cauchemar puisqu’elle prive l’administrateur… du droit d’administrer.

En gros, WordPress vous reconnaît comme utilisateur, il sait que vous êtes admin mais il attend de vous une poignée de main magique : oui, encore du SQL !

Pendant l’importation des tables, une valeur – une chaîne très longue – est mal passée. Il va donc falloir l’éditer à la main :

  1. Sous MySQLFront ou PHPmyadmin, ouvrez la table wp_options
  2. Trouvez la clé appelée wp_user_roles et remplacez sa valeur par cette longue chaîne de caractères, sur une ligne :

    a:5:{s:13:"administrator";a:2:{s:4:"name";s:13:"Administrator";s:12:"capabilities";a:30:{s:13:"switch_themes";b:1;s:11:"edit_themes";b:1;s:16:"activate_plugins";b:1;s:12:"edit_plugins";b:1;s:10:"edit_users";b:1;s:10:"edit_files";b:1;s:14:"manage_options";b:1;s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:6:"import";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:8:"level_10";b:1;s:7:"level_9";b:1;s:7:"level_8";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;}}s:6:"editor";a:2:{s:4:"name";s:6:"Editor";s:12:"capabilities";a:19:{s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;}}s:6:"author";a:2:{s:4:"name";s:6:"Author";s:12:"capabilities";a:8:{s:12:"upload_files";b:1;s:10:"edit_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:4:"read";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;}}s:11:"contributor";a:2:{s:4:"name";s:11:"Contributor";s:12:"capabilities";a:4:{s:10:"edit_posts";b:1;s:4:"read";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;}}s:10:"subscriber";a:2:{s:4:"name";s:10:"Subscriber";s:12:"capabilities";a:2:{s:4:"read";b:1;s:7:"level_0";b:1;}}}

  3. Sauvegardez la clé. Vous devriez désormais être en mesure d’accéder au module d’administration.

SQLFront ? Et PHPmyadmin ?

J’ai effectué toutes ces opérations en utilisant SQLFront pour la simple raison qu’il est beaucoup plus rapide pour importer les données (et qu’il les a importé correctement, ce qui est loin d’être évident avec PHPmyadmin) et qu’il est très aisé de modifier les valeurs de champs (un clic suffit).

A vous de voir ce qui vous convient le mieux. PHPmyadmin est certainement installé sur votre serveur. SQLFront – anciennement MySQL-Front – est à installer sur votre machine.

Conclusion

Voilà, une bonne chose de faite même si cela ne change absolument rien à la présentation générale du blog.

Tout se passe sous le capot mais il est bon de vérifier les rouages de temps à autre. Et maintenant je suis tranquille pour un bon petit moment ;-)

Rencontrez-vous des défis avec votre site WordPress ou WooCommerce? Laissez-moi les résoudre pour vous.

Discutons des solutions possibles »

Articles conseillés :

Matt

Matt Biscay est développeur WordPress et WooCommerce certifié chez Codeable, ainsi que sysadmin qualifié et enseignant-chercheur. Passionné par le code performant et les solutions sécurisées, je m'efforce d'offrir une expérience utilisateur exceptionnelle sur chaque projet.

Vous avez aimé cet article ? Vous avez un projet en tête et vous pensez que je pourrais vous aider à le concrétiser ? N'hésitez pas à me contacter, je serais ravi de discuter avec vous de votre projet !

8 pensées sur “WordPress: migration d’une base de données iso-8859-15 au format UTF-8”

  1. oui c’est une qualamité les changements d’encodages :) ba bravo alors pour la migration, ça allégera peut etre wordpress les 5-6 plugins en moins ;)

    Reply
  2. Oui, je dois dire que cette nouvelle version est très agréable à utiliser, une fois que l’éditeur HTML enrichi a été désactivé. C’est fou ce que cela peut foirer comme code… Je suis très content d’avoir installé SQLFront, cela fait gagner un temps considérable ^_^

    Reply
  3. Merci merci, grace à ton aide me voila sortie de la panade qui durait depuis plusieurs jours…sacré “capabilities.php”, une question me taraude, comment as tu pu trouver d’oucette erreur provenait? chapeau bas!
    tu es mon miracle du jour! ;o)
    (je vais m’attaquer au problemes d’accents qui semblent avoir souffert lors de la migration ;o)

    Reply
  4. Content de pouvoir t’aider shmileblik :)
    Pour résoudre l’erreur, je me suis penché sur le compte administrateur et ses privilèges/droits. C’est comme cela que je me suis rendu compte qu’il y avait un champs de la base de données qui n’était pas conforme.

    Reply
  5. Merci beaucoup ! J’avais exactement ce probleme et il est parfaitement résolu en suivant votre explication ! :-)

    Ketah.

    Reply
  6. Salut !
    Merci beaucoup pour l’astuce de l’import sql en binaire, çà m’a sauvé !!
    J’ai exporté pourtant d’une base UTF 8 vers une nouvelle UTF8, mais des problèmes d’accents, exportés en ISO 8859-1 persistait !
    Bonne continuation !

    Reply

Opinions