Retour au portfolio
Mesogeiako — Centre de Formation Professionnelle & CMS sur Mesure

Mesogeiako — Centre de Formation Professionnelle & CMS sur Mesure

Mesogeiako est un centre agréé de formation tout au long de la vie et de formation professionnelle à Thessalonique, et son site avait grandi sur WordPress et le constructeur de pages de BeTheme. La reconstruction garde tout le contenu et rien de la plateforme. C'est du PHP 8.5 pur sur MySQL — un contrôleur frontal, un autoloader de quinze lignes, sans framework, sans Composer et sans étape de build — environ cinq mille lignes de code et deux mille de templates. Le grec est la langue par défaut et l'anglais vit sous /en/, et la parité est structurelle plutôt que rapportée : chaque projet, actualité et page est une ligne avec une ligne de traduction par langue, les slugs appartiennent à la traduction pour que les pages grecques gardent des URL dérivées du grec, et une troisième langue ne demanderait aucun changement de schéma. La migration est du code, pas un export ponctuel. Vingt et une étapes ordonnées et rejouables reconstruisent tout le site depuis la source WordPress — elles lisent le contenu du Muffin Builder, retirent les textes répétitifs, normalisent les titres, fusionnent les actualités en double et extraient en fichiers les images intégrées en data-URI — et transfèrent 33 projets, 90 actualités et 20 pages dans les deux langues, avec 798 redirections pour que les anciens liens mènent à leurs nouvelles pages. Chaque image de la médiathèque est un WebP de moins de 200 Ko : la qualité descend de 82 à 40, puis les dimensions réduisent jusqu'à ce qu'il tienne, et l'original est supprimé. Le back-office donne au centre ses projets, actualités et pages dans les deux langues sous TinyMCE, une médiathèque, les coordonnées, ainsi que les compteurs et les blocs de la page d'accueil. Les données structurées portent l'adresse postale, le numéro du registre du commerce et les horaires — trois informations que l'ancien site publiait dans un widget de pied de page du thème, où aucun article ni aucun importeur ne pouvait les voir.

Technologies

PHP 8.5 MySQL Vanilla JS GSAP TinyMCE 7 WebP pipeline (GD) i18n (EL/EN) SEO WordPress migration

Défis

WordPress avait caché certains faits. L'adresse postale, le numéro du registre du commerce et les horaires se trouvaient dans un widget de pied de page du thème plutôt que dans un article, donc un export de contenu ne les voyait jamais, et le second numéro de téléphone se contredisait à trois endroits de l'ancien site. Les URL grecques cassaient aussi la conception évidente de la base : encodées en pourcentage, elles dépassent souvent 191 caractères tout en partageant de longs préfixes, si bien qu'un index de préfixe rejette comme doublons des adresses réellement différentes. Et un éditeur bilingue a un mode de défaillance silencieux : un enregistrement qui omet une langue est indiscernable d'une personne qui la vide volontairement.

Solutions

Chaque correction est sa propre étape de migration numérotée, si bien qu'une reconstruction à neuf depuis WordPress reproduit le numéro de téléphone confirmé par le client et l'adresse retrouvée au lieu de réimporter les anciennes erreurs. Les redirections sont uniques sur un hachage SHA-256 de l'ancien chemin plutôt que sur un préfixe. Chaque segment d'archive ne se résout que dans sa propre langue, pour qu'un élément ne vive pas à deux URL en partageant son propre référencement. Chaque formulaire de traduction envoie un marqueur de présence par langue — c'est ce qui permet à une langue absente de signifier « inchangée » plutôt que « supprimer » —, et la suite de tests du back-office contient un test de non-régression pour cela. Les noms de fichiers sont normalisés en NFC avant la translittération, car macOS et Linux stockent le même nom grec sous des octets différents.