Workflow IA

Figma vers Elementor : il n’y a pas de bouton, il y a une méthode

Deux MCP pour lire Figma, deux pour écrire dans Elementor, WP-CLI en repli, un navigateur pour mesurer au pixel. La méthode d’une campagne livrée, et celle du prochain site.

Objectif : passer d’une maquette Figma à une page Elementor fidèle au pixel, sans convertisseur. Deux MCP pour lire la maquette, deux pour écrire dans Elementor, WP-CLI quand aucun ne suffit, et un navigateur sans fenêtre pour mesurer l’écart. Tolérance visée : 4 pixels.

« Figma vers Elementor » : la recherche revient sans cesse, et la réponse attendue est un bouton. Importer, convertir, publier. Je n’en utilise aucun. Ma dernière campagne, une page de treize sections et 11 109 pixels de haut, est passée de Figma au site entre le 28 août et le 15 septembre 2026, avec Claude Code et une poignée de MCP. Voici la méthode, les outils, et la question à poser avant la première ligne de code.

La question qui décide de tout : qui modifiera la page ?

Avant d’ouvrir Figma, je pose une question au projet. Pas « comment reproduire cette maquette ? ». Plutôt : « qui touchera cette page après moi, et pour quoi faire ? » Deux réponses possibles, deux architectures.

CritèreWidgets Elementor natifsGabarit PHP + ACF dans une enveloppe Elementor
Qui modifieUn rédacteur qui compose ses pagesUne personne qui change textes et images
LibertéInsérer, dupliquer, réordonner des blocsRemplir des champs, la mise en page ne bouge pas
Fidélité au pixelBonne, bornée par les contrôles d’ElementorTotale : le CSS est écrit à la main
Listes répétéesWidgets répétés un par unRépéteur ACF, une boucle PHP
Outil d’écritureEMCP ToolsPHP, ACF, WP-CLI
Mon casLe site magazine (maquette attendue)La campagne de sensibilisation

La campagne était une page de sensibilisation pour une association de santé publique. Une page longue, un contenu fixe, et côté client une personne qui change des textes et des images, jamais la structure. Le gabarit PHP s’imposait. Un argument technique a fini de trancher : les Dynamic Tags d’Elementor ne savent pas parcourir un répéteur ACF. Or la maquette en était pleine : listes, cartes, témoignages.

Le site magazine, lui, sera composé par des rédacteurs, sans une ligne de code. Ils insèrent des blocs, les dupliquent, les réordonnent. Là, seuls des widgets natifs tiennent. Même Figma en entrée, sortie opposée.

Lire la maquette : deux MCP Figma, deux rĂ´les

Claude Code ne voit pas Figma. Il lui faut un pont. J’en utilise deux, et ils ne se remplacent pas.

CritèreMCP officiel FigmaPlugin claude-talk-to-figma
ConnexionAPI distante, sans étatWebSocket vers Figma Desktop
ParallélismePlusieurs appels simultanésUn canal partagé, un appel à la fois
Point fortGraisses par segment, images sourcesCouleurs exactes, coordonnées, inventaire des textes
Outils utilisésget_design_context, get_metadata, download_assets, get_screenshotget_node_info, get_styled_text_segments, scan_text_nodes, export_node_as_image

Le connecteur officiel : la structure et les images

get_design_context renvoie du React avec des classes Tailwind. Pour un thème WordPress, ce code ne sert à rien tel quel : je n’en garde que la structure, les textes, les couleurs et les espacements. Sa vraie valeur est ailleurs. Il donne la graisse de chaque segment de texte. Sur un paragraphe, il a montré d’un coup que deux noms propres étaient en Bold et tout le reste en SemiBold, là où le plugin aurait exigé un relevé complet.

download_assets livre les images sources, pas seulement le rendu : un fichier de 3 452 x 1 786 pixels là où l’export du nœud en fait 812 x 457. Le recadrage de Figma se reconstruit à partir de l’original. Détail qui compte : les URL expirent en quelques minutes. On télécharge tout de suite.

Le plugin : les mesures exactes

get_node_info donne les couleurs, les coordonnées absolues et les caractères exacts d’un nœud. scan_text_nodes est le seul moyen de retrouver un texte dont on ignore l’emplacement : 87 textes sur la frame française, un résultat de 58 Ko. Je le fais lire par un script, pas par le modèle. Seul défaut du plugin : un canal WebSocket partagé, un appel à la fois, des délais d’attente fréquents. Quand il cale, je me rabats sur le connecteur officiel.

Trois pièges de lecture

  • Les identifiants changent. Trois jeux d’identifiants depuis le dĂ©but du projet, un par re-collage de la maquette. Je retrouve les nĹ“uds par leur nom ou leur texte, jamais par un id notĂ© la semaine prĂ©cĂ©dente.
  • Les gros rĂ©sultats dĂ©bordent. get_metadata sur la page entière pèse 311 000 caractères. Le rĂ©sultat part dans un fichier, un script Python en tire l’inventaire, et je n’appelle get_design_context que sur les nĹ“uds utiles.
  • La boĂ®te d’un texte n’est pas celle de l’élĂ©ment. Un item de liste mesurait 448,16 px dans Figma : la largeur du texte seul. Avec le retrait de la puce, la bonne valeur Ă©tait 475,4. Un mot passait Ă  la ligne, et une seule rangĂ©e de pixels le trahissait.

Construire : une section Ă  la fois, sans initiative de design

Une règle ouvre chaque brief : aucune initiative de design. Tout vient du Figma. Ce qui manque, une photo, un lien, un texte absent, devient un contenu provisoire clairement marqué et une question ouverte. Jamais un texte qui pourrait passer pour définitif.

Côté WordPress, la page Elementor n’est qu’une enveloppe. Elle contient un seul widget, le shortcode [prevention_page], qui assemble les sections dans un ordre fixe. ACF stocke le contenu, et chaque section a son interrupteur Afficher/Masquer.

Chaque section suit ensuite le mĂŞme circuit :

Figma (frame 1440 px)
   │  MCP officiel : structure, graisses, images sources
   │  plugin       : couleurs, coordonnées, textes
   â–Ľ
Plan de section (.md)            relevés, pièges, questions ouvertes
   â–Ľ
section-*.php + champs ACF + bloc CSS
   â–Ľ
Script de contenu idempotent     wp eval-file script.php <post_id>
   â–Ľ
Capture headless à 1440 px   →   rangées de pixels contre le rendu Figma
   â–Ľ
Écart ≤ 4 px ?    non : corriger    oui : commit

Claude Code a écrit le PHP, le CSS et les scripts. Les arbitrages, la relecture des plans et chaque validation visuelle sont restés les miens. Le script de contenu est idempotent : relancé dix fois, il donne dix fois le même résultat, et il signale les contenus encore provisoires.

Mesurer, pas regarder

L’œil ment. Un titre en Anton se rend dans une boîte de 74,4 px là où Figma en compte 79. Aligner les boîtes donne un résultat faux. Aligner l’encre donne le bon.

Je compare donc le rendu Figma et une capture du site à 1440 px avec le même script Python (PIL, numpy) : un masque par couleur, les rangées de pixels contiguës regroupées, et on obtient le haut de chaque ligne et l’étendue de chaque boîte. Tolérance : 4 px sur les lignes et les boîtes, 4 px sur la hauteur de la section. Tout écart supérieur est noté avec sa cause.

La capture vient d’un Chrome sans fenêtre, piloté par le protocole DevTools. Une contrainte s’est imposée en route : comparer des pixels exige le même navigateur. Une référence prise dans une version de Chrome contre des captures d’une autre version différait partout, à cause du rendu des polices.

Cohabiter avec Elementor sans qu’il reprenne la main

Un gabarit PHP dans un site Elementor hérite quand même d’Elementor. Trois pièges, tous rencontrés :

  • Le kit gagne les conflits. Le kit global impose police et couleur Ă  tous les titres avec un sĂ©lecteur de spĂ©cificitĂ© 0-1-1. Une règle de classe simple (0-1-0) perd. La parade : prĂ©fixer par le conteneur racine de la page (0-2-0). Aucun !important.
  • L’ancien CSS reste chargĂ©. Elementor charge elementor-post-<ID>.css selon l’identifiant de la page, pas selon son mode de rendu : 46 dĂ©clarations d’une ancienne mise en page restaient actives. Un wp_dequeue_style ciblĂ© les retire sans toucher au header ni au footer.
  • Les polices ne suivent pas. Elementor sert les Google Fonts en local, page par page. Un gabarit PHP n’en profite plus : le thème auto-hĂ©berge les siennes.

Écrire dans Elementor : quel MCP choisir ?

Sur le site magazine, les widgets natifs s’imposent, et l’écriture passe par un MCP. J’ai comparé ce qui existe aujourd’hui en interrogeant chaque serveur, pas en lisant sa page de présentation. Mesures du 25 septembre 2026, sur Elementor 4.2.0 et Elementor Pro 4.1.2.

CritèreEMCP ToolsMCP officiel ElementorMCP AdapterWP-CLI
NaturePlugin tiersModule intégré à ElementorPlugin WordPress.orgLigne de commande
Outils exposés1375Aucun en propreTout, sans garde-fou
Widgets classiquesOuiNon, éléments atomiques seulementSans objetOui, en JSON brut
ActivationInstaller le pluginRéglage expérimental cachéInstaller le pluginDéjà là
Mon usageOutil principalVeilleSocle des deux premiersRepli

EMCP Tools : l’outil de travail

137 outils actifs en version 3.17.1 : widgets classiques et atomiques, conteneurs, classes globales, variables, modèles, champs ACF, médias, historique avec retour arrière. Les 34 outils à risque (écriture de fichiers, écriture SQL, plugins, utilisateurs) sont désactivés par défaut. On les active un par un, jamais en bloc.

J’étais resté en 3.0.0. La mise à jour vers la 3.17.1 n’était pas du confort : entre les deux, des corrections de perte de données. update-page-settings remplaçait tout l’objet de réglages, et une retouche d’une seule clé sur le kit effaçait couleurs et typographies personnalisées. Des widgets tiers disparaissaient en silence à la sauvegarde. Sauvegarde du plugin et de la base avant, contrôle après : 51 pages Elementor, zéro JSON invalide.

Un réflexe à garder : relire après chaque création. Pendant la validation, add-container acceptait css_classes sans erreur et ne l’enregistrait pas. get-element-settings montre ce qui est vraiment stocké.

Le MCP officiel : cinq outils, pour l’instant

L’annonce d’Elementor promet des pages complètes, le design system, les parties de thème, des widgets sur mesure. Dans le code d’Elementor 4.2.0, le module existe déjà, derrière un réglage expérimental caché et inactif par défaut :

wp option update elementor_experiment-e_wp_abilities_api active

Une fois activé, il expose cinq outils : list-pages, get-page-structure, update-page-settings, create-page, get-globals. Il ne vise que les éléments atomiques de la V4. Le site magazine compte 51 pages Elementor, dont 11 seulement contiennent des éléments atomiques. Les capacités annoncées demandent en plus Angie, l’agent d’Elementor, que je n’ai pas installé. Je le garde activé pour suivre son évolution. J’ai raconté ailleurs pourquoi la V4 n’est pas encore mon terrain.

Le MCP Adapter : pourquoi les deux cohabitent

EMCP et le module d’Elementor s’enregistrent tous deux auprès du même MCP Adapter de WordPress. Chacun obtient sa route, sans conflit : 137 et 5 outils répondent en parallèle. Une condition : EMCP 3.17.1 minimum, qui corrige une découverte OAuth où il répondait à la place d’un second plugin MCP.

{
  "mcpServers": {
    "emcp-tools": {
      "type": "http",
      "url": "http://site.test/wp-json/mcp/emcp-tools-server",
      "headers": { "Authorization": "Basic <base64(user:application-password)>" }
    },
    "elementor-official": {
      "type": "http",
      "url": "http://site.test/wp-json/elementor/mcp",
      "headers": { "Authorization": "Basic <base64(user:application-password)>" }
    }
  }
}

WP-CLI : le repli

Sans MCP, on écrit le JSON _elementor_data directement, comme Elementor le fait. C’est ainsi que j’ai modifié le header mobile du site de la campagne :

update_metadata('post', $id, '_elementor_data', wp_slash(wp_json_encode($data)));
delete_post_meta($id, '_elementor_css');
delete_post_meta($id, '_elementor_element_cache');
\Elementor\Plugin::$instance->files_manager->clear_cache();

Ça marche, sans aucune validation. Quatre règles apprises sur des sites sans MCP :

  • Sauvegarder avec mysql -N -r - sans -r, le client double les antislashs et le JSON devient invalide.
  • _elementor_page_settings est du PHP sĂ©rialisĂ© - lecture en hexadĂ©cimal, puis update_post_meta(), sinon corruption.
  • Une page créée par script exige quatre mĂ©tas - _elementor_edit_mode, _elementor_template_type, _elementor_version et le modèle de page. Sans elles, la page s’affiche vide, sans erreur.
  • Les URL sont stockĂ©es Ă©chappĂ©es - un search-replace doit aussi chercher https:\/\/.

Le site magazine : la méthode, avant la maquette

La maquette du site magazine n’est pas encore arrivée. Le site tourne sur un design system provisoire : couleurs et typographies globales d’Elementor, variables CSS. Voici l’ordre que j’appliquerai, repris de la campagne et adapté aux widgets natifs :

  1. Inventorier la maquette avec get_metadata, parsé par script, avant tout appel coûteux.
  2. Reporter couleurs et typographies dans les réglages globaux d’Elementor, jamais widget par widget.
  3. Construire les blocs un par un sur une page atelier, via EMCP.
  4. Relire chaque création avec get-element-settings.
  5. Mesurer à 1440 px contre le rendu Figma, même script, même tolérance.
  6. Valider chaque bloc moi-même avant d’en faire un modèle réutilisable avec save-as-template.

La différence avec la campagne tient en une ligne : le résultat final n’est plus une page, c’est une bibliothèque de blocs que les rédacteurs assemblent sans moi.

Résultats

MesureValeur
Chantier de la campagnedu 28 août au 15 septembre 2026
Commits sur la période200
Maquette1 440 x 11 109 px, 13 sections
Textes inventoriés87 en français, 96 en néerlandais
Fichiers de section PHP (gabarit complet)21
CSS du gabarit4 913 lignes
Assets exportés du Figma28
Tolérance de mesure4 px
Outils EMCP Tools 3.17.1137
Outils du MCP officiel (Elementor 4.2.0)5

Les limites

  • Le gabarit PHP enferme le client. Il change des textes, pas la structure. Une nouvelle section, c’est du code. Un choix assumĂ©, pas un dĂ©faut cachĂ©.
  • Le MCP officiel est jeune. Cinq outils, les Ă©lĂ©ments atomiques seulement, derrière un rĂ©glage cachĂ©. Ă€ réévaluer Ă  chaque version.
  • EMCP est un plugin tiers. Dix-sept versions mineures depuis la 3.0.0. Chaque mise Ă  jour exige une sauvegarde et la lecture du journal des changements.
  • La mesure ne juge pas le goĂ»t. Un Ă©cart nul dit que la page est fidèle, pas qu’elle est bonne. La validation visuelle reste humaine.

Le bilan

  • La première question n’est pas technique. Qui modifiera la page dĂ©cide de l’architecture, avant mĂŞme d’ouvrir Figma.
  • Lire et Ă©crire sont deux mĂ©tiers. Deux MCP pour lire la maquette, un MCP pour Ă©crire dans Elementor, WP-CLI quand aucun ne suffit.
  • Interroger le serveur, pas la page de prĂ©sentation. 137 outils d’un cĂ´tĂ©, 5 de l’autre : aucune annonce ne le disait.
  • Mesurer bat regarder. Des rangĂ©es de pixels, une tolĂ©rance, et chaque Ă©cart expliquĂ©.
  • Ce n’est pas un bouton magique. C’est une mĂ©thode, des outils et la discipline de vĂ©rifier. Le site magazine repartira de lĂ .

Les ressources

Les deux serveurs MCP pour Elementor, le socle WordPress qui les fait cohabiter, et le plugin Figma utilisé pour les mesures exactes.

EMCP Tools · MCP Adapter · Elementor MCP · claude-talk-to-figma

Le tutoriel complet, sur simple demande

Cet article résume la méthode. Je peux en tirer un tutoriel complet, pas à pas : le script de mesure au pixel, le modèle de plan de section, la configuration des MCP Figma et Elementor, et tous les pièges consignés en route. Vous passez de Figma à Elementor et vous voulez ce tutoriel, ou un coup de main sur votre projet ? Écrivez-moi.

Me contacter