Extensions

Système de hooks pour plugins

Architecture du système de plugins

QuietCMS embarque un système de plugins léger inspiré des hooks WordPress, mais volontairement simplifié pour rester cohérent avec la philosophie sans base de données du CMS. Chaque plugin réside dans son propre sous-dossier sous plugins/<slug>/ et doit contenir deux fichiers obligatoires : plugin.json (métadonnées) et index.php (code exécutable).

Structure d'un plugin

Le fichier plugin.json déclare les informations du plugin ainsi que les hooks qu'il utilise :

{
    "name": "Mon Tracker",
    "description": "Injecte un script de suivi analytique.",
    "version": "1.0.0",
    "author": "Votre Nom",
    "hooks": ["body_end"]
}

Le tableau hooks liste tous les points d'accroche que le plugin souhaite utiliser. QuietCMS ne chargera que les plugins dont au moins un hook est actif.

Hooks disponibles

QuietCMS expose actuellement deux hooks principaux :

  • head_end — déclenché juste avant la balise </head> ; idéal pour injecter des feuilles de style, des balises <meta> supplémentaires ou des scripts de préchargement.
  • body_end — déclenché juste avant la balise </body> ; parfait pour les scripts analytics, les chatbots ou les bandeaux de consentement.

Convention de nommage des fonctions

La fonction hook doit respecter la convention plugin_<slug>_<hook><slug> est le nom du dossier du plugin et <hook> est le nom du point d'accroche. Elle reçoit un tableau $args et ne retourne rien :

<?php
function plugin_my_tracker_body_end(array $args): void {
    echo '<script src="https://example.com/tracker.js" defer></script>';
}

Déclenchement des hooks dans le moteur

C'est la méthode statique PluginManager::doAction($hook, $args) qui parcourt l'ensemble des plugins actifs et appelle la fonction correspondante si elle existe. Elle est invoquée dans layout.php à deux endroits précis :

// Avant </head>
<?php PluginManager::doAction('head_end', ['page' => $page]); ?>

// Avant </body>
<?php PluginManager::doAction('body_end', ['page' => $page]); ?>

Activation des plugins

L'activation se fait depuis le panneau d'administration sous Admin → Plugins. Un clic sur « Activer » ajoute le slug du plugin dans le tableau active_plugins de content/settings.json :

{
    "active_plugins": ["cookie-notice", "my-tracker"]
}

Les plugins désactivés ne sont jamais chargés, même si leurs fichiers sont présents sur le disque.

Passer des données aux hooks

Pour transmettre du contexte supplémentaire à un hook, étendez le tableau $args lors de l'appel à doAction() dans layout.php. Par exemple, pour passer la page courante et les paramètres globaux :

PluginManager::doAction('body_end', [
    'page'     => $page,
    'settings' => $settings,
    'request'  => $_SERVER['REQUEST_URI'],
]);

Ajouter de nouveaux hooks

Si les deux hooks par défaut ne suffisent pas, ouvrez core/PluginManager.php et ajoutez un appel à doAction() à l'endroit désiré dans le cycle de vie de la page. Par convention, préfixez les hooks internes avec qcms_ pour éviter les conflits avec des plugins tiers.

Sécurité

Les plugins s'exécutent avec un accès PHP complet au serveur. Il est impératif de :

  • Valider et assainir toutes les données provenant de $_GET, $_POST ou $_COOKIE dans votre plugin.
  • N'installer que des plugins provenant de sources de confiance.
  • Réviser le code de tout plugin tiers avant activation sur un site en production.

Articles similaires