Hooks et développement de plugins
Étendez TubePress grâce à son système de hooks d’action et de filtre de style WordPress : plus de 15 points d’ancrage, le cycle de vie d’un plugin, et comment créer et empaqueter votre propre plugin.
Les plugins permettent d'ajouter des fonctionnalités à TubePress sans modifier le cœur. Ils s'intègrent au CMS via un système de style WordPress composé d'actions (événements fire-and-forget) et de filtres (qui modifient une valeur et la retournent). Les trois plugins fournis — Age Gate, Backup Pro et CTR Ranking — sont entièrement construits avec la même API documentée ici.
Le système de hooks
La classe statique HookSystem gère les deux types de hook. Les callbacks s'exécutent par ordre de priorité croissant (par défaut 10) ; toute exception levée par un callback est capturée et consignée, de sorte qu'un plugin défaillant ne peut jamais faire planter la page.
// Actions — do something when an event fires
HookSystem::addAction('head.meta', function () {
echo '<meta name="rating" content="adult">';
}, 10);
// Filters — receive a value, return a (possibly) changed value
HookSystem::addFilter('theme.template_data', function ($data, $template) {
if ($template === 'home') {
$data['promo'] = Promo::current();
}
return $data;
});| Méthode | Rôle |
|---|---|
addAction($hook, $cb, $priority = 10) | Enregistre un écouteur d'action. |
doAction($hook, ...$args) | Déclenche une action (appelée par le cœur). |
addFilter($hook, $cb, $priority = 10) | Enregistre un filtre. |
applyFilter($hook, $value, ...$args) | Fait passer une valeur à travers ses filtres et la retourne. |
hasAction() / hasFilter() | Vérifie si des écouteurs sont enregistrés. |
removeAction() / removeFilter() | Détache tous les écouteurs d'un hook. |
Points de hook disponibles
Le cœur déclenche ces hooks. Vous pouvez également en définir et en déclencher depuis un plugin.
Actions
| Hook | Quand il se déclenche |
|---|---|
head.meta | Dans le <head>, après le CSS — ajoutez des balises meta, des balises de vérification, etc. |
footer.scripts | Avant </body>, après le JS — ajoutez des scripts d'analyse ou des widgets. |
routes.registered | Après l'enregistrement de toutes les routes du cœur, avant le catch-all de page. |
router.before_dispatch | Juste avant l'exécution d'un handler correspondant. Argument : le chemin résolu. |
Filtres
| Hook | Modifie (args) |
|---|---|
theme.template_data | Le tableau de données avant le rendu d'un template. Args : ($data, $templateName). |
head.css | La chaîne de sortie CSS combinée. |
footer.scripts | La chaîne de sortie JS combinée. |
video.card.html | Le HTML complet de la carte vidéo. Args : ($html, $video). Retournez une chaîne non vide pour le remplacer. |
Anatomie d'un plugin
Un plugin est un dossier sous plugins/ avec un manifeste et une classe implémentant PluginInterface.
plugins/myplugin/
├── plugin.json Manifest (name, slug, version, …)
├── myplugin.php Main class implementing PluginInterface
├── icon.svg Optional icon shown in the admin
└── … Your assets, templates, migrationsLe manifeste reprend la structure des plugins fournis :
{
"name": "My Plugin",
"slug": "myplugin",
"description": "What it does, in one sentence.",
"version": "1.0.0",
"author": "You",
"requires": "1.0.0",
"icon": "icon.svg"
}La classe principale implémente les six méthodes du cycle de vie de PluginInterface :
| Méthode | Appelée quand |
|---|---|
boot() | À chaque requête tant que le plugin est actif — enregistrez ici les hooks, routes et assets. |
activate() | L'administrateur active le plugin. |
deactivate() | L'administrateur le désactive. |
install() | Première activation — créez les tables et initialisez les paramètres. |
uninstall() | Le plugin est supprimé — nettoyez. |
info() | Retourne les données du manifeste sous forme de tableau. |
Enregistrement des routes & assets
Effectuez toute la configuration dans boot() :
public function boot(): void
{
// A front-end route
Router::get('/promo/{code}', [PromoController::class, 'show']);
// Inject a meta tag
HookSystem::addAction('head.meta', [$this, 'meta']);
// Tweak every video card
HookSystem::addFilter('video.card.html', [$this, 'badge'], 20);
}Tâches planifiées dans un plugin
Enregistrez une tâche récurrente avec le CronManager depuis boot() — il s'appuie sur le pseudo-cron intégré, aucune crontab système n'est donc nécessaire. C'est ainsi que le plugin CTR recalcule les scores et que Backup Pro exécute les sauvegardes planifiées.
Plugins fournis comme références
Distribution & licences
Vous pouvez garder un plugin privé, le partager librement ou le vendre via le marketplace, qui ajoute une licence signée et une activation par domaine. Consultez Développement de thème pour l'équivalent côté présentation, et la référence de l'API de thème pour tout ce qui est disponible dans le code des templates.
Toujours bloqué ?
Ouvrez un ticket depuis votre tableau de bord et notre équipe vous assistera.