Hooks & pluginontwikkeling
Breid TubePress uit met het WordPress-achtige action- en filter-hooksysteem: 15+ hookpunten, de pluginlevenscyclus en hoe je je eigen plugin bouwt en verpakt.
Plugins zijn de manier om functies toe te voegen aan TubePress zonder de kern aan te raken. Ze koppelen aan het CMS via een klein WordPress-stijl systeem van acties (eenmalige gebeurtenissen) en filters (een waarde aanpassen en teruggeven). De drie meegeleverde plugins — Age Gate, Backup Pro en CTR Ranking — zijn volledig gebouwd met dezelfde API die hier wordt gedocumenteerd.
Het hook-systeem
De statische HookSystem-klasse beheert beide soorten hooks. Callbacks worden uitgevoerd in oplopende prioriteitsvolgorde (standaard 10); elke uitzondering die een callback gooit wordt opgevangen en gelogd, zodat één slechte plugin nooit de pagina kan laten crashen.
// 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;
});| Methode | Doel |
|---|---|
addAction($hook, $cb, $priority = 10) | Registreer een actie-luisteraar. |
doAction($hook, ...$args) | Activeer een actie (de kern roept deze aan). |
addFilter($hook, $cb, $priority = 10) | Registreer een filter. |
applyFilter($hook, $value, ...$args) | Leid een waarde door de filters en geef het terug. |
hasAction() / hasFilter() | Controleer of er iets luistert. |
removeAction() / removeFilter() | Ontkoppel alle luisteraars voor een hook. |
Beschikbare hook-punten
De kern activeert deze hooks. Je kunt ook eigen hooks definiëren en activeren vanuit een plugin.
Acties
| Hook | Wanneer het wordt geactiveerd |
|---|---|
head.meta | Binnenin <head>, na de CSS — voeg meta-tags, verificatietags, enz. toe. |
footer.scripts | Voor </body>, na de JS — voeg analytics of widgets toe. |
routes.registered | Nadat alle kernroutes zijn geregistreerd, vóór de algehele pagina-afhandeling. |
router.before_dispatch | Net voor een gematchte handler wordt uitgevoerd. Arg: het opgeloste pad. |
Filters
| Hook | Wijzigt (args) |
|---|---|
theme.template_data | De data-array vóór het renderen van een template. Args: ($data, $templateName). |
head.css | De gecombineerde CSS-uitvoerstring. |
footer.scripts | De gecombineerde JS-uitvoerstring. |
video.card.html | De volledige HTML van de videokaart. Args: ($html, $video). Geef een niet-lege string terug om deze te vervangen. |
Anatomie van een plugin
Een plugin is een map onder plugins/ met een manifest en een klasse die PluginInterface implementeert.
plugins/myplugin/
├── plugin.json Manifest (name, slug, version, …)
├── plugin.php Main class implementing PluginInterface; must end with return new MyPlugin();
├── icon.svg Optional icon shown in the admin
└── … Your assets, templates, migrationsHet manifest is gelijk aan dat van de meegeleverde plugins:
{
"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"
}De hoofdklasse implementeert de zes levenscyclus-methoden van PluginInterface:
| Methode | Aangeroepen wanneer |
|---|---|
boot() | Elke aanvraag terwijl de plugin actief is — registreer hier hooks, routes en assets. |
activate() | De beheerder activeert de plugin. Draait bij elke activering — maak hier je tabellen en standaardinstellingen idempotent aan (CREATE TABLE IF NOT EXISTS). |
deactivate() | De beheerder deactiveert deze. |
install() | Verplicht door de interface, maar de kern roept het nooit aan — doe je initialisatie in activate(). |
uninstall() | De plugin wordt verwijderd — opruimen. |
info() | Geeft de manifestdata terug als array. |
Routes en assets registreren
Doe al uw koppelingen in 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);
}Geplande taken in een plugin
Registreer een terugkerende taak met de CronManager vanuit boot() — het draait op de ingebouwde pseudo-cron, zodat geen systeem-crontab nodig is. Dit is hoe de CTR-plugin scores herberekent en Backup Pro geplande back-ups uitvoert.
Meegeleverde plugins als referentie
Distribueren en licenties
Je kunt een plugin privé houden of vrij delen; de marketplace verspreidt alleen de eigen plugins van TubePress. Zie Thema-ontwikkeling voor het equivalent aan de presentatiekant, en de Theme API-referentie voor alles wat beschikbaar is voor templatecode.
Nog vastgelopen?
Open een ticket vanuit uw dashboard en ons team helpt u verder.