Aller au contenu
TubePress — gratuit, auto-hébergé & activement maintenu
Référence développeur

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éthodeRô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

HookQuand il se déclenche
head.metaDans le <head>, après le CSS — ajoutez des balises meta, des balises de vérification, etc.
footer.scriptsAvant </body>, après le JS — ajoutez des scripts d'analyse ou des widgets.
routes.registeredAprès l'enregistrement de toutes les routes du cœur, avant le catch-all de page.
router.before_dispatchJuste avant l'exécution d'un handler correspondant. Argument : le chemin résolu.

Filtres

HookModifie (args)
theme.template_dataLe tableau de données avant le rendu d'un template. Args : ($data, $templateName).
head.cssLa chaîne de sortie CSS combinée.
footer.scriptsLa chaîne de sortie JS combinée.
video.card.htmlLe 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, migrations

Le 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éthodeAppelé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);
}
Auto-suffisant par conception. Un plugin doit ajouter tout ce dont il a besoin — son propre schéma, ses paramètres, ses routes, ses pages d'administration et ses tâches planifiées — et tout supprimer lors de la désinstallation, sans modifier le CMS de base. Le plugin CTR Ranking en est un bon exemple.

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.

Essayer la démo en direct → Télécharger TubePress →