← Tous les projets

Business Web Agence · Six plugins pour l’agence

Le code d’un composant BWA à côté du widget qu’il devient dans Elementor, et les six plugins

Plugins WordPress

Les plugins que j’ai créés pour faire gagner du temps à toute l’équipe, de la création de composants à la traduction d’un site entier.

Rôle
Conception et développement
Technos
WordPress, Elementor, PHP, WP-CLI, Action Scheduler, API OpenAI
01

Le projet

En agence, j’ai créé six plugins WordPress. Deux servent toute l’équipe sur chaque projet : l’un fabrique les composants Elementor, l’autre traduit des sites entiers. Deux autres sont nés pour l’extranet du BIVB, parce qu’aucun plugin du marché ne couvrait ses besoins. Les voici, ouverts un par un.

01 / 06 · Utilisé par la plupart des développeurs de l’agence

BWA Component

Un composant, c’est un dossier dans le thème : un template PHP, un manifeste et un fichier qui déclare ses champs. Le plugin le découvre, en fait un widget Elementor et charge son CSS et son JS là où il sert. Ouvrez-le :

Trois fichiers dans le thème suffisent : le template, le manifeste et la déclaration des champs. La grille appelle une carte avec component_item() : les composants s’emboîtent.

<?php

return [
    'icon'     => 'eicon-banner',
    'category' => 'bwa-sections',
    'sections' => [
        ['id' => 'content', 'label' => 'Contenu'],
        ['id' => 'style', 'label' => 'Style', 'tab' => 'style'],
    ],
    'controls' => [
        ['id' => 'kicker', 'label' => 'Surtitre', 'type' => 'text', 'section' => 'content'],
        ['id' => 'title', 'label' => 'Titre', 'type' => 'textarea', 'section' => 'content'],
        ['id' => 'text', 'label' => 'Texte', 'type' => 'wysiwyg', 'section' => 'content'],
        ['id' => 'button_url', 'label' => 'Lien du bouton', 'type' => 'url', 'section' => 'content'],
        ['id' => 'image', 'label' => 'Image', 'type' => 'media', 'section' => 'content'],
        ['id' => 'variant', 'label' => 'Variante', 'type' => 'select', 'section' => 'style',
            'options' => ['light' => 'Clair', 'dark' => 'Sombre']],
    ],
];
Terminal · WP-CLI
$ wp bwa-component list
name              group      version  elementor  css  path
Carte d’atout     items      1.0.0               1    items/feature-card
Grille d’atouts   sections   1.0.0    1          1    sections/features-grid
Hero partagé      sections   1.0.0    1          1    sections/hero-split
Total: 3 component(s)

$ wp bwa-component validate
path                     valid
items/feature-card       1
sections/features-grid   1
sections/hero-split      1

$ wp bwa-component
  create (c, generate, g)   Create a component from CLI stubs
  control                   Create a custom Elementor control scaffold
  pair (create-pair)        Create a section and item component wired together
  list (ls)                 List discovered component.json files
  validate                  Validate component structure and metadata
  model                     Native content model files: create, list, inspect, validate.
  content                   WordPress content: list, get, export, validate, plan, apply.

Captures faites sur un WordPress de démonstration, avec des composants de test.

  • Des champs déclarés, pas codés

    Texte, image, lien, répéteur, couleur, typographie : une ligne par champ dans widget.php, et le panneau Elementor se construit tout seul.

  • Des composants qui s’emboîtent

    Un composant en appelle un autre avec component(), avec des slots nommés, à la manière de Vue ou de React.

  • Les assets à la demande

    Chaque composant embarque son CSS et son JS ; GSAP, Swiper ou Lenis ne se chargent que là où ils servent.

  • Un registre partagé

    On publie un composant avec ses captures et sa version, puis on l’installe sur un autre site, dépendances comprises.

  • Un CLI

    Créer, lister, valider, générer une paire section et carte : tout se fait aussi en ligne de commande.

  • Pensé pour l’IA

    Des skills pour Claude Code et Codex : l’IA sait créer, convertir et déboguer un composant. Monter un site devient bien plus rapide.

02 / 06 · API OpenAI · près de 2 000 pages pour Filab

BWA Traduction

Traduire un site WordPress entier par IA, et le garder à jour. Tout est traduit, et tout reste lié à la version d’origine : une modification en français se propage aux autres langues.

  • Tout le site

    Les pages Elementor en gardant leur structure, mais aussi les types de contenu personnalisés, les formulaires et les menus.

  • Une langue source

    On définit la langue d’origine d’une page ou d’un type de contenu : les autres langues en dépendent.

  • Des traductions liées

    Je modifie la page en français, et ses versions traduites sont retraduites automatiquement.

  • Par lots, en arrière-plan

    Les traductions passent par l’Action Scheduler, celui de WooCommerce, découpées en lots : des milliers de pages sans bloquer le site.

  • Des liens traduits

    Les liens internes de chaque page pointent vers les pages de la bonne langue.

  • Publiées ou en brouillon

    Une option permet de garder les traductions en brouillon, pour les relire avant de les mettre en ligne.

Sur un vrai site : Filab

Un laboratoire d’analyse dijonnais : le site existait en français, anglais, belge et suisse. Avec le plugin, près de 2 000 pages sont passées en espagnol, en italien et en allemand. Après avoir comparé plusieurs services, j’ai retenu l’API d’OpenAI pour son rapport qualité-prix.

Filab en français, le site d’origine
Français : le site d’origine.

03 / 06 · Créée pour l’extranet du BIVB

Médiathèque

Une médiathèque bien plus riche que celle de WordPress, pour les centaines de documents que l’interprofession partage avec les professionnels du vin.

DossiersCommunicationTechniqueMarchésPresseRéglementation
Rechercher un document…TousPDFImagesTableurs
PDFBulletin technique — vendanges 202612/09/20262,4 MoRemplacer
PDFCharte graphique des appellations03/09/20268,1 MoNouvelle version · v2
PhotoVendanges, © J. Durand28/08/20265,6 MoDroits jusqu’au 30/11
XLSXChiffres clés des marchés21/08/2026640 KoRemplacer
Illustration : l’extranet n’est pas encore en ligne, je n’en montre pas les écrans.
  • Classer et retrouver

    Des dossiers, une recherche et des filtres par type pour s’y retrouver parmi des centaines de documents.

  • Remplacer

    Un média peut être remplacé par sa nouvelle version, directement depuis la médiathèque.

  • Reliée aux accès

    Elle s’appuie sur le plugin de gestion des accès : seuls les professionnels connectés y entrent.

  • Droits d’image

    Chaque photo indique son auteur et la date où ses droits expirent ; un e-mail prévient quand l’échéance arrive.

04 / 06 · Créé pour l’extranet du BIVB

Accès

Une gestion des accès bien plus fine qu’un simple système de rôles : on décide qui voit quoi, jusqu’à la personne, et les droits se transmettent d’eux-mêmes.

Rôle « Viticulteur »Groupe « Négociants »Personne · C. Martin
Espace professionnelsPageAutoriséAutoriséAutorisé
Bulletins techniquesPage enfantHéritéHéritéHérité
Catégorie « Marchés »TaxonomieRefuséAutoriséSur mesure
Note de conjonctureContenu de la catégorieRefuséHéritéHérité
Illustration : l’extranet n’est pas encore en ligne, je n’en montre pas les écrans.
  • Par rôle, par groupe, par personne

    Un accès se donne à un rôle, à un groupe ou à une personne précise.

  • Par page

    Chaque page peut être réservée à certains profils ; ses pages enfants héritent de ses droits.

  • Par taxonomie

    Une catégorie peut porter des droits, et tout son contenu en hérite.

  • Des accès personnalisés

    Pour les cas particuliers, des règles sur mesure s’ajoutent aux autres.

Et aussi

05 · RéutilisableFAQ

Une gestion des questions fréquentes, prête à resservir d’un site à l’autre.

06 · SEO localPages par ville

Génère des pages à partir d’une liste de villes, pour le référencement local.