Cet article a pour but de présenter les aspects techniques essentiels d'une de nos réalisations majeures de 2024, au cours de laquelle nous avons concrétisé la vision de notre client à travers une série de sites web attrayants pour diverses marques d'un même groupe. Notre ambition était de développer une solution distinctive, fondée sur une architecture technique commune, qui non seulement préserve l'identité de chaque marque, mais les met également en valeur. Nous souhaitons vous offrir un aperçu des coulisses du projet afin de vous fournir les outils nécessaires pour réussir votre propre projet headless.
L’ambition du projet était donc de décliner sous la forme d’une solution centrée sur le CMS Wordpress toute une série de sites web implémentant des fonctionnalités variées (content, store locator, présentation d’offres, réservation en ligne,...) dans une architecture headless évolutive et pérenne.
Le choix Wordpress s’est imposé en grande partie du fait de la disponibilité en Open Source de la solution mais aussi de la familiarité du client avec ce CMS. L’enjeu du projet résidait dans la capacité de construire, sur ce socle, un ensemble de sites par marque disposant de fonctionnalités identiques mais avec une approche UX/UI propre à chaque marque.
Il a donc fallu construire une architecture qui permette - vraiment - de découpler le comportement fonctionnel, porté par un template unique pour l’ensemble des marques, et le rendu utilisateur porté par une UI spécifique propre à l’identité de chaque enseigne.
D’habitude le template d’une solution Wordpress intègre le fonctionnel et l’UX/UI sachant que les modifications de l’Ui sont généralement faibles : modification de couleurs, quelques choix de blocs,...
Dans notre contexte, les modifications d’UI sont bien plus importantes au niveau des menus, des sliders, …
Les menus sont une source de divergence non négligeable entre les différentes marques. Les modes de présentations et d’interactions sont multiples et propres à chacune d’entre elles.
Comme on peut le voir sur les illustrations suivantes (1 et 2), une marque peut vouloir un bloc qui s’ouvre au clic sur l’entrée du header correspondante, présenter un visuel et ouvrir les sous-menus sur un clic de l’utilisateur. Tandis qu’une seconde peut vouloir interagir au survol, sans illustration et présenté en mode “bulle”. De la même manière, la position du logo au sein du menu header est également propre à chaque marque.
Sur ce second bloc (illustration 3 et 4) qui est un slider catégorisé, le mode de présentation des catégories, la gestion de la pagination, de la navigation et des propriétés du slider (nombre de slide visible, slide suivante prévisualisée ou non, slider automatiquement ou pas, etc..) sont également propres à chaque marque.
L’architecture se structure autour des composants suivants:
Wordpress permet d’être interfacé en mode headless au moyen de ses API (Rest et GraphQL). La plupart des contributions CMS peuvent nativement être récupérées par ces APIs. Il nous a fallu néanmoins développer un plugin WP afin d’ajouter certaines informations, notamment concernant les traductions mises en place avec WPML.
L'architecture headless a permis une grande flexibilité pour intégrer des sources externes. Contrairement à une approche traditionnelle WordPress qui aurait nécessité le développement de plugins pour chaque fonctionnalité spécifique (store locator, flux Instagram, sliders Flowbox, etc.), l'usage de Next.js en front-end a permis une interfaçabilité native avec divers services et API tierces.
Cette approche nous a permis de déléguer les fonctionnalités dynamiques et personnalisées à des composants front-end modernes, réactifs et optimisés pour les performances. Chaque service ou API externe est ainsi consommé de manière isolée, sans impacter directement le cœur du CMS. Cette modularité permet une meilleure évolutivité de l’ensemble de l’application.
Développer ces fonctionnalités sous forme de plugins WordPress aurait pu entraîner plusieurs défis. Premièrement, cela aurait alourdi le back-office, rendant le site potentiellement plus lent et moins sécurisé, car chaque plugin WP augmentant le nombre de dépendances et de points de vulnérabilité. En parallèle, certains services externes, comme l'API Instagram, nécessitent des mises à jour fréquentes pour maintenir leur compatibilité ; une intégration directe dans le front-end via Next.js permet donc d'assurer une gestion des dépendances plus fine et une réduction des risques liés aux versions obsolètes.
Next.js apporte également des avantages considérables en termes de performance et de SEO. Les données dynamiques issues des APIs externes peuvent être mises en cache côté serveur (ISR - Incremental Static Regeneration) ou côté client, en fonction des besoins, permettant un rendu rapide des pages sans re chargement excessif. Les chargements asynchrones des contenus améliorent également l'expérience utilisateur, particulièrement utile pour des éléments visuels comme les flux Instagram et les sliders.
En somme, l’architecture headless nous a permis d’allier l’efficacité d’un CMS éprouvé comme WordPress avec la puissance et la modularité d’un front-end moderne.
Dans notre architecture headless, le rôle de WordPress est de permettre aux contributeurs de créer et de structurer le contenu grâce à des pages, des articles, et des custom post types (produits, offres, services).
Pour chaque page, un "template" est défini. Ce template regroupe un ensemble de blocs ACF (Advanced Custom Fields) disponibles pour construire la page. Ces blocs constituent les building blocks de notre application, offrant ainsi une grande modularité.
Cette approche offre une flexibilité inégalée aux contributeurs. Ils peuvent :
En résumé, les contributeurs ont une totale liberté pour créer des pages riches, personnalisées et dynamiques, tout en bénéficiant d’un système structuré et intuitif.
Côté Next.js, chaque requête de page est interprétée selon un processus simple et efficace :
Cette architecture garantit une intégration fluide entre WordPress et Next.js tout en offrant une grande flexibilité pour les contributeurs et une puissance inégalée en front-end.
Pour garantir une performance optimale, une mise à jour fluide et une résilience face aux imprévus, l'architecture headless mise en place repose sur trois niveaux de caches.
Chaque requête effectuée par Next.js (vers WordPress, des APIs externes ou la base de données MongoDB) est mise en cache pour une durée spécifique définie en collaboration avec le client, via un TTL (Time-To-Live).
Fonctionnement :
L’utilisation de l’app router de Next.js 14 permet de générer les pages de manière efficace :
Pour les données provenant d’APIs externes, nous avons mis en place un cache spécifique dans MongoDB.
Trois mécanismes assurent une synchronisation fluide :
Pour des besoins spécifiques (par exemple, une mise à jour sensible ou juridique), les contributeurs peuvent forcer la régénération des pages via une API d’invalidation. En indiquant les tags concernés, cette API utilise les outils natifs de Next.js pour :
1
. PerformanceLes utilisateurs bénéficient d’un affichage instantané, car la plupart des pages sont déjà générées et servies depuis le CDN.
Les contributeurs n’ont pas besoin d’intervenir pour synchroniser leurs modifications : le système de TTL assure une mise à jour fluide et continue entre WordPress, les APIs et le front-end.
Le cache MongoDB évite les dépendances directes aux APIs externes, minimisant ainsi l’impact des lenteurs ou indisponibilités des services tiers.
En cas de besoin urgent, les contributeurs peuvent forcer une mise à jour immédiate, sans attendre la fin du TTL.
Cette gestion fine des caches est une pièce maîtresse de l’architecture, combinant performance, fiabilité et flexibilité pour répondre aux besoins de nos contributeurs et utilisateurs.
L’API native de WordPress ne fournit pas toutes les données nécessaires, notamment dans un contexte multilingue avec WPML. Par exemple, il est indispensable de connaître les slugs des pages ou des custom post types dans les différentes langues pour gérer correctement le sélecteur de langue sur le front-end et respecter les exigences SEO, telles que des URL sémantiques traduites.
Pour pallier cette limitation, un plugin WordPress personnalisé a été développé. Ce plugin enrichit l’API WordPress pour exposer ces informations supplémentaires, permettant ainsi à Next.js de gérer efficacement les liens interlangues et d’améliorer la navigation multilingue.
Une autre contrainte majeure a concerné la gestion multilingue proposée nativement par Next.js, jugée trop rudimentaire et présentant des défauts importants pour le SEO. Ces limitations incluent :
Pour résoudre ce problème, next-roots (une bibliothèque tierce) a été intégrée. Ce projet open source, dirigé par svobik7, permet une gestion avancée du multilingue avec Next.js. L'équipe a également contribué activement à ce projet via plusieurs PR pour lever certaines limitations, tout en remerciant chaleureusement svobik7 pour son excellent travail. Grâce à cette collaboration, next-roots nous a permis :
Next.js est optimisé pour fonctionner sur Vercel, mais l'architecture a été déployée sur des serveurs d’un prestataire tiers, en utilisant pm2 pour servir l'application en mode cluster avec 8 processus Node.js. Ce mode améliore les performances en répartissant les requêtes utilisateur entre plusieurs processus.
Cependant, ce modèle a posé un problème pour l'invalidation des caches : lorsqu’un contributeur utilise l’API pour invalider un tag de cache, seul le processus qui traite la requête effectue cette opération. Les autres processus conservent leurs caches invalides.
Pour résoudre ce problème, une communication IPC (Inter-Process Communication) a été mise en place. Chaque processus informe les autres de la demande d'invalidation via un message IPC. Ainsi, tous les processus propagent l'invalidation des tags et assurent une cohérence du cache au sein du cluster.
WordPress propose aux contributeurs de prévisualiser :
Un système a été développé pour valider le token du contributeur, garantir les droits d'accès, et récupérer via l'API WordPress les brouillons ou modifications non enregistrées. Cette fonctionnalité a nécessité un plugin WordPress supplémentaire et une logique complexe côté Next.js, mais elle offre aux contributeurs un contrôle total sur leurs contenus avant leur publication.
Ce projet démontre les avantages d’une architecture headless, combinant la flexibilité de WordPress pour la gestion des contenus et la performance de Next.js pour un front-end moderne et réactif.
Grâce à cette approche, nous avons pu offrir une solution robuste, multilingue, multimarque, multipays et parfaitement adaptée aux besoins des contributeurs tout en garantissant une expérience utilisateur optimale.
Au-delà des aspects techniques, ce projet montre également l’importance de la collaboration dans l’écosystème open source, comme en témoigne notre contribution au projet next-roots.
N’hésitez pas à contacter nos experts pour en savoir plus sur ces questions.
Découvrez le cas client Provalliance (Franck Provost, Jean Louis David, etc.), leader de la coiffure.
Découvrez les avantages et inconvénients du headless en open source avec Magento 2.
Découvrez l'actu tech et digitale de la semaine : investissements d'Amazon dans Anthropic, Black Friday, chi
Un aperçu des points intéressants de la tech et du digital que nous avons vu cette semaine.