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> où <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,$_POSTou$_COOKIEdans 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
Plugin AI Content : génération avec GPT-4o, Claude et Mistral
Générez du contenu HTML directement depuis QuietCMS avec OpenAI, Anthropic Claude, Mistral, Groq et d'autres LLMs.
Plugin Cookie Notice : conformité RGPD
Le plugin Cookie Notice de QuietCMS affiche une bannière de consentement configurable conforme au RGPD.
Rendre son site multilingue avec QuietCMS : l'extension complète
Comment rendre un site multilingue avec QuietCMS : URLs préfixées /xx/, hreflang automatiques, traduction par IA, sitema…