Une extension WordPress qui fournit une sidebar animée et entièrement personnalisable, pensée pour les équipes qui veulent un rendu professionnel sans renoncer à la simplicité d'administration.
- Vérification des permissions lors de l'activation et création automatique du dossier
uploads/sidebar-jlg/icons/afin de préparer l'import d'icônes personnalisées. En cas d'échec, le message d'erreur est journalisé et affiché dans l'administration pour guider la remise en route. - Chargement automatique du text-domain et enregistrement d'un menu dédié dans l'administration pour garder l'expérience cohérente avec WordPress.
- Page de configuration unique avec regroupement logique des réglages (contenu, styles, comportements) et champs spécialisés : color picker natif, sélection d'icônes, tri et drag & drop des éléments de menu.
- Prévisualisation embarquée de la sidebar, synchronisée via AJAX (
jlg_render_preview) pour valider instantanément les variations graphiques et la sélection de profil actif. - Tableau de bord « Comparatif Pro » résumant les forces et chantiers (UI/UX, accessibilité, fiabilité, visuel) pour aligner l'expérience avec les suites professionnelles haut de gamme.
- Déclencheurs comportementaux directement configurables (timer, profondeur de scroll, exit intent, inactivité) pour ouvrir automatiquement la sidebar sans recourir au code.
- Bibliothèque d'icônes prête à l'emploi (manifest JSON), outils de téléversement sécurisé (limites MIME/taille) et récupération du SVG pour les besoins spécifiques.
- Outils d'import/export JSON versionnés, remise à zéro contrôlée et sélection directe de contenus WordPress (articles, pages, catégories) grâce aux points d'entrée AJAX dédiés.
- Préréglages de style (
style_presets) comprenant visuels de comparaison avant/après pour accélérer la mise en production. - Nouveaux presets inspirés de Headless UI, Shadcn UI, Bootstrap, Semantic UI, Radix UI et Anime.js pour disposer de palettes et comportements prêts à l’emploi.
- Contrôle complet des dimensions (largeurs par appareil, marges, rayons, etc.), typographies (graisse, capitalisation, interlignage), jeux de couleurs (dégradés sur texte/fond/boutons) et animations (vitesse, flou, effet néon).
- Gestion granulaire du bouton hamburger (position, taille, couleur, offset) pour respecter le contraste et les contraintes de marque.
- Overlay responsive avec contrôle de l'opacité et du flou sur mobile pour conserver une lisibilité optimale.
- Constructeur d'éléments de menu mixant pages, articles, catégories, menus WordPress, liens personnalisés et séparateurs, chacun pouvant recevoir une icône (bibliothèque, SVG inline ou URL contrôlée).
- Filtrage des menus WordPress importés (tous les éléments, niveau 1 uniquement, branche courante) et limitation de profondeur pour proposer des expériences adaptées au contexte.
- Gestion des icônes sociales avec validation stricte (URL obligatoires, SVG vérifié), possibilité d'ajouter ses propres pictogrammes depuis la médiathèque.
- Bloc Gutenberg dynamique
jlg/sidebar-searchsynchronisé avec les réglages globaux pour insérer le module de recherche où vous le souhaitez.
- Bouton toggle dédié aux sous-menus (
menu-item-has-children) avec attributs ARIA (aria-expanded,aria-controls) et libellés dynamiques selon l'état. - Navigation clavier complète : fermeture via
Esc, flèche bas pour ouvrir, conservation du focus et différenciation mobile/desktop pour éviter les pièges lors du balayage tactile. - États de focus alignés sur les hover, prise en charge automatique des contrastes pour la recherche (schémas clair/sombre) et préservation des attributs ARIA des icônes importées.
- Onglet « Accessibilité & WCAG 2.2 » dédié dans l’administration avec checklist interactive (contrastes, focus, alternatives clavier, tailles de cibles, etc.) et calcul automatique du taux de conformité par profil.
- Lancement d’un audit Pa11y directement depuis WordPress : saisissez l’URL de votre choix et obtenez un rapport JSON interprété (erreurs/avertissements/notices) sans quitter l’administration.
- Script
npm run audit:accessibility(Pa11y) préconfiguré pour contrôler la page de démonstration et servir de base à vos audits personnalisés.
- Profils multiples hiérarchisés par priorité et spécificité permettant d'appliquer des réglages différents selon le contexte courant (page, type de contenu, taxonomie, rôles utilisateurs, statut de connexion, langue, appareil, horaires et jours).
- Résolution centralisée du contexte via
RequestContextResolver(URL normalisée, post courant, taxonomies, langues, rôles, détection mobile) pour que le rendu et la sélection de profil partagent la même source de vérité. - Sélecteur d'horaires (timepicker, jours de semaine) pour activer des campagnes temporelles spécifiques (ex. promotion week-end).
- Export JSON annoté avec la version du plugin et l'URL source pour faciliter la traçabilité en multi-environnements.
- Import avec validation complète (nonce, typage, filtrage des icônes, recalcul des menus) et remontée d'erreurs contextualisées.
- Réinitialisation guidée des réglages (hook
jlg_reset_settings) pour repartir des valeurs par défaut en un clic.
- Cache HTML des rendus de sidebar, segmenté par locale et suffixe de profil, avec invalidation automatique lors des mises à jour de contenu, menus, icônes ou version du plugin.
- Normalisation et sanitation poussée de tous les réglages (couleurs, dimensions, opacités, champs texte) pour éviter les injections et assurer la cohérence des données.
- Gestion des erreurs lors des téléversements d'icônes (journalisation, notices administrateur, rollback) pour que les incidents n'altèrent pas l'expérience de vos utilisateurs.
- Tableau de bord dédié dans l’administration (« Insights & Analytics ») pour suivre les ouvertures, clics de navigation et conversions CTA.
- Répartition par profil actif et historique des sept derniers jours afin de comparer rapidement les campagnes contextuelles.
- Comparatif 7j/30j intégré pour visualiser le poids de la dernière semaine dans le volume global d'interactions.
- Collecte optionnelle activable dans l’onglet Général pour respecter les environnements sensibles aux métriques.
- Télécharger l'archive du plugin ou cloner ce dépôt.
- Copier le dossier
sidebar-jlgdans le répertoirewp-content/pluginsde votre site WordPress. - Activer Sidebar - JLG dans l'administration WordPress.
Après activation, un menu "Sidebar JLG" apparait dans l'administration. Vous pouvez :
- Activer ou désactiver la sidebar.
- Choisir le style : couleurs, typographie, effets d'animation, marges…
- Ajuster la position et la couleur du bouton hamburger pour garantir le contraste.
- Profiter d'états de focus alignés sur les effets de survol pour les liens, icônes et boutons afin d'améliorer la navigation au clavier.
- Renseigner les dimensions en utilisant des unités classiques (
px,rem,vh, etc.) ou des expressionscalc()composées d'opérateurs arithmétiques autorisés. - Ajouter des éléments de menu (pages, articles, catégories, liens personnalisés), des menus WordPress, des séparateurs et des icônes sociales.
- Activer une recherche intégrée et personnaliser son affichage.
- Importer vos propres icônes SVG en les plaçant dans le dossier
wp-content/uploads/sidebar-jlg/icons/. - Créer des profils ciblés (pays, rôles, appareils, horaires) et en activer un par défaut pour couvrir les cas généraux.
- Depuis l’onglet Outils de la page d’administration, utilisez le bouton Exporter les réglages pour générer un fichier JSON contenant la configuration actuelle (
sidebar_jlg_settings). - Conservez ce fichier dans votre système de contrôle de versions ou partagez-le avec votre équipe pour synchroniser les environnements.
- Sur l’environnement cible, sélectionnez ce fichier via le bouton Importer les réglages puis confirmez l’action. Les options existantes sont validées et remplacées avant que la page ne soit automatiquement rechargée.
- Les exports incluent la version du plugin et l’URL du site source pour faciliter les audits et vérifier que l’import a été réalisé sur le bon environnement.
- Le bloc dynamique
jlg/sidebar-searchpermet d'insérer l'encart de recherche de la sidebar dans l'éditeur du site. - Les attributs
enable_search,search_method,search_alignmentetsearch_shortcodesont synchronisés avec les options globales du plugin via leSettingsRepositorypour garantir la rétrocompatibilité avec les installations existantes. - Le bloc affiche un aperçu direct dans l'éditeur grâce au script d'édition (
sidebar-jlg/assets/js/blocks/sidebar-search.js) et interroge le rendu dynamique (wp/v2/block-renderer/jlg/sidebar-search) afin de refléter le résultat côté public, y compris pour les shortcodes et hooks personnalisés. - L'aperçu côté éditeur gère un état de chargement/erreur et conserve les classes
sidebar-searchainsi que l'attributdata-sidebar-search-alignpour que les scripts d'habillage appliquent les mêmes styles que sur le front. - Les scripts générés sont exposés via
block.jsonet chargés automatiquement par WordPress depuissidebar-jlg/assets/build. Après compilation, vérifiez que les fichierssidebar-search(.asset).phpetsidebar-search-view(.asset).phpsont bien présents afin de garantir le chargement du bloc aussi bien dans l'éditeur que sur le site public. - Pour recompiler les scripts du bloc après modification, exécutez
npm run build, puis (optionnel) contrôlez dans la console du navigateur WordPress que le blocjlg/sidebar-searchn'émet aucun avertissement de script manquant. - Afin d'assurer une lisibilité optimale dans l'éditeur, la feuille de style
sidebar-search-editor.scssapplique désormais par défautvar(--wp-admin-theme-color)(ou une teinte sombre) lorsque--sidebar-text-colorn'est pas défini. Le script de vue ajoute automatiquement une classesidebar-search--editorousidebar-search--frontendpour conserver une palette cohérente entre l'édition et l'affichage public. - Le bloc ajoute automatiquement la classe
sidebar-search--scheme-lightet l'attributdata-sidebar-search-scheme="auto". Le script de vue mesure la luminance decolorpour basculer verssidebar-search--scheme-darklorsque le texte doit contraster avec un fond sombre. Sur un fond foncé explicitement configuré dans votre mise en page, ajoutez simultanément la classesidebar-search--scheme-darketdata-sidebar-search-scheme="dark"(ou fixezcolorvia CSS) afin de forcer la variante claire du formulaire. - Usage recommandé : insérez le bloc dans des zones dont la couleur de texte est déjà cohérente avec le reste du contenu. Pour les héro ou sections pleine largeur sombres, appliquez la classe
sidebar-search--scheme-darksur le conteneur (ou sur un bloc groupe englobant) et vérifiez le contraste en prévisualisation ; pour les zones claires, la configuration automatique suffit et reste synchronisée aveccurrentColor.
- Seuls les fichiers au format
.svgsont chargés par le plugin. Chaque fichier est contrôlé avecwp_check_filetype()avant d'être ajouté à la bibliothèque. - Le contenu SVG est validé via
wp_kses. Les fichiers dont le contenu est altéré par le nettoyage ou qui contiennent des éléments non autorisés sont ignorés pour éviter toute contamination. - Un contrôle supplémentaire inspecte les attributs
href/xlink:hrefdes balises<use>afin de s'assurer qu'ils pointent uniquement vers un identifiant local ou vers un média de la bibliothèque (wp-content/uploads). Les validations spécifiques sont centralisées dansSidebar\\JLG\\Icons\\IconLibrary::validateSanitizedSvg()pour simplifier l'ajout de nouvelles règles de sécurité. - Les attributs ARIA usuels (
aria-label,aria-describedby, etc.) sont désormais préservés lors de la validation afin de faciliter l'accessibilité des icônes.
- Les éléments
menu-item-has-childrenaffichent désormais un bouton dédié (toggle) placé à droite du lien parent. Le bouton expose les attributsaria-expanded,aria-controlset met à jour son libellé automatiquement pour refléter l'état du sous-menu. - Les sous-menus sont masqués par défaut via une classe
is-openet bénéficient d'une indentation, de séparateurs visuels et de transitions douces. Les états ouverts sont conservés pour les éléments de navigation correspondant à la page courante et leurs hauteurs sont recalculées dynamiquement (ResizeObserver) pour suivre les variations de contenu. - Le script public gère les interactions clavier (Esc pour refermer, flèche bas pour ouvrir et focaliser le premier lien) et différencie mobile/desktop : sur les écrans tactiles étroits, l'ouverture d'un sous-menu referme ses frères afin de limiter le défilement. Les sous-menus fermés sont rendus inactifs (
pointer-events: none) pour éviter les pièges de focus. - Des gestes tactiles optionnels reproduisent l'ouverture par glissement depuis le bord et la fermeture latérale, avec gestion de la zone active et du seuil de déclenchement pour coller aux usages des barres latérales professionnelles.【F:sidebar-jlg/includes/admin-page.php†L404-L459】【F:sidebar-jlg/assets/js/public-script.js†L60-L1269】
- Une option « Mémoire de session » s'appuie sur le stockage local du navigateur pour rouvrir la sidebar comme lors de la dernière visite (sous-menus ouverts, position de scroll, CTA consultés) et peut être activée depuis l'onglet Général.【F:sidebar-jlg/includes/admin-page.php†L404-L410】【F:sidebar-jlg/assets/js/public-script.js†L48-L129】【F:sidebar-jlg/assets/js/public-script.js†L600-L782】
- Vérification manuelle : navigation testée en mode tactile (émulation iPhone 12 Pro Max dans Chromium) pour valider les appuis successifs sur les toggles, la fluidité des transitions et la conservation du focus clavier.
Les constructeurs professionnels (Elementor Pro, JetMenu, Max Mega Menu, ConvertBox, etc.) proposent des expériences hors-canvas complètes. La comparaison ci-dessous synthétise les écarts actuels :
| Critère | Sidebar JLG | Solutions professionnelles |
|---|---|---|
| Intégration WordPress | Native (options, profils, bloc Gutenberg) | Souvent via interfaces propriétaires ou shortcodes spécifiques |
| Ciblage contextuel | Rôles, appareils, langues, horaires | Segmentations basiques (rôles/terminaux) ; granularité avancée payante |
| Gestion des icônes/SVG | Manifest versionné, sanitation stricte, notifications | Upload simple, rarement audité ou mutualisé |
| Éditeur visuel | Formulaire administrateur + prévisualisation AJAX | Constructeurs WYSIWYG temps réel, drag & drop |
| Bibliothèque de widgets | Menu, recherche, icônes sociales | CTA, formulaires, sliders, intégrations CRM/marketing |
| Analytique | Module Insights (ouvertures, clics, CTA) | Tableaux de bord intégrés (taux d'ouverture, conversions) |
| Personnalisation dynamique | Profils basés sur contexte WordPress | Déclencheurs comportementaux (scroll depth, sortie, A/B testing) |
| Qualité & CI | Tests unitaires PHP/JS, pas d'E2E ni de CI prête à l'emploi | Pipelines CI/CD, tests visuels, linting complet |
Sidebar JLG se démarque actuellement par :
- Une intégration WordPress native : réglages, profils ciblés et bloc Gutenberg limitent les ruptures d'expérience avec l'écosystème WordPress.
- Un ciblage contextuel fin : résolution de contexte unifiée, hiérarchie de profils et règles temporelles dignes d'offres haut de gamme.
- Une gouvernance des actifs SVG stricte : validation, journalisation et notifications réduisent fortement les risques de sécurité.
- Un module Insights embarqué : collecte activable et tableau de bord mettent en lumière les ouvertures, clics et conversions CTA sans quitter l’interface WordPress.
Pour atteindre (voire dépasser) le niveau de finition des meilleures suites professionnelles, les axes suivants sont recommandés :
- Éditeur visuel temps réel : proposer un mode WYSIWYG drag & drop (à la manière d'Elementor ou de Max Mega Menu Pro) permettant de modifier la structure et les contenus directement sur la page visitée.
- Bibliothèque de composants : ajouter des modules prêts à l'emploi (CTA, formulaires, flux sociaux, intégrations WooCommerce) avec styles cohérents, états de hover/focus et options de tracking.
- Analyse et personnalisation dynamique : enrichir le module Insights avec des déclencheurs conditionnels (scroll depth, temps passé, intention de sortie) et des scénarios A/B pour atteindre le niveau des suites comme ConvertBox ou OptinMonster.
- Internationalisation avancée : intégrer automatiquement les traductions via WPML/Polylang, synchroniser les profils linguistiques et permettre la duplication rapide d'un profil dans une autre langue.
- Automatisation qualité : fournir des commandes de tests E2E (Playwright/Cypress), un pipeline CI (GitHub Actions) et des préconfigurations de linting (PHP_CodeSniffer, ESLint, Stylelint) pour sécuriser les contributions open source.
- Accessibilité renforcée : ajouter une grille d'audit automatique (axe DevTools Lighthouse, tests pa11y) et documenter les cas d'usage pour les lecteurs d'écran afin de se placer au niveau des offres labellisées ADA/WCAG.
- Monétisation et support : proposer un canal de support communautaire, une feuille de route publique et, à terme, des plans premium (icônes exclusives, intégrations marketing) pour rassurer les équipes qui comparent avec des éditeurs établis.
- Onboarding guidé : intégrer un assistant de configuration pas-à-pas (checklist ou tours interactifs) qui aide les nouveaux utilisateurs à activer chaque fonctionnalité clé et à comprendre la hiérarchie profils > contenus > styles.
- Compatibilité thèmes & builders : documenter et distribuer des presets dédiés aux principaux thèmes/page builders (Blocksy, Astra, Divi, Bricks) en anticipant leurs particularités CSS et en fournissant des snippets prêts à l'emploi.
- Observabilité produit : exposer des webhooks ou une API REST pour recevoir des événements (ouverture, clic, profil déclenché) et permettre l'intégration avec des outils comme Zapier, Make ou des dashboards internes.
- Expérience mobile améliorée : proposer une vue éditeur mobile-first avec prévisualisation tactile simulée, des breakpoints configurables et un mode "split view" pour comparer facilement les rendus desktop/tablette/mobile.
- Marketplace d'extensions : ouvrir un système d'extensions légères (hooks documentés, manifest JSON) pour que la communauté puisse ajouter des connecteurs (CRM, analytics, marketing automation) et partager leurs composants.
- Refactorisation du cache et des hooks d'initialisation : isoler l'invalidation de cache et la revalidation des options dans des hooks d'activation/mise à jour afin d'éviter les écritures répétées sur
wp_optionset les rebuilds globaux des transients. Un suivi détaillé figure dansAUDIT.mdetdocs/code-review-2024-04.md. - Évolution de l'aperçu et de l'éditeur : prototyper un mode « canvas » immersif (plein écran, interactions inline) ainsi qu'une palette de commandes (
Cmd/Ctrl + K) pour accélérer la navigation dans les réglages. Les spécifications UX/UI sont centralisées dansdocs/comparaison-pro.mdetdocs/axes-roadmap.md. - Accessibilité automatisée : compléter la checklist WCAG 2.2 avec un audit Pa11y prêt à l'emploi et des rappels contextualisés dans l'UI. Les actions à mener sont décrites dans
docs/accessibility-checklist.md. - Nouveaux presets et compatibilités thèmes : enrichir
DefaultSettings::STYLE_PRESETSavec des variantes ciblées (Astra, Divi, Bricks) et documenter leur intégration. Un backlog de presets recommandés est maintenu dansdocs/presets-ui.md. - Observabilité & intégrations externes : préparer une API REST/webhooks pour exposer les événements d'ouverture/clic et faciliter les raccords avec Zapier/Make. Les dépendances et livrables sont listés dans
docs/axes-roadmap.md.
Chaque axe dispose d'un lot prioritaire, de prérequis et d'indicateurs associés détaillés dans la feuille de route dédiée : docs/axes-roadmap.md.
La désinstallation supprime les options enregistrées par le plugin.
Le plugin est écrit en PHP, HTML, CSS et JavaScript. Les fichiers principaux se trouvent dans :
sidebar-jlg/sidebar-jlg.phpsidebar-jlg/includes/sidebar-jlg/assets/
Installez les dépendances npm et exécutez les tests unitaires JSDOM avec :
npm install
npm run test:jsLe script npm run audit:accessibility s'appuie sur Pa11y/Puppeteer. Sur une distribution minimale (CI, conteneur), installez les
paquets système nécessaires avant d'exécuter la commande :
sudo ./scripts/install-puppeteer-deps.shLe script installe les bibliothèques graphiques (GTK, X11, Cairo, etc.) requises par Chrome headless. Il peut être relancé sans risque et s'intègre facilement dans un job CI.
Le service JLG\\Sidebar\\Frontend\\RequestContextResolver centralise toutes les informations de contexte utilisées par le rendu de la sidebar et par la sélection de profil (URL normalisée, contenus consultés, taxonomies, rôles, langue, appareil, horaires, etc.). Il est injecté dans SidebarRenderer et ProfileSelector afin de garantir que les deux composants s’appuient sur la même source de vérité.
Pour ajouter un nouveau signal de contexte :
- Compléter le service : étendre la méthode
resolve()(et, si nécessaire, les méthodes privées associées) pour collecter et exposer la nouvelle donnée. Conservez un format simple (types scalaires ou tableaux) et documentez toute transformation appliquée. - Mettre à jour les consommateurs : adaptez
ProfileSelectoret/ouSidebarRendereruniquement si un traitement supplémentaire est nécessaire pour exploiter le nouveau signal. Le contexte partagé doit rester la source unique de lecture. - Renforcer les tests : ajoutez une assertion explicite dans
tests/request_context_resolver_test.phppour couvrir le nouveau signal et mettez à jour, le cas échéant, les scénarios des testsprofile_selector_*ourender_sidebar_*qui reposent sur ces données. - Synchroniser la documentation : si le signal influence le comportement public du plugin, complétez ce README ou les notes d’implémentation pertinentes pour faciliter les futurs ajouts.
Distribué sous licence GPL v2 ou ultérieure.