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, …)
├── myplugin.php Main class implementing PluginInterface
├── 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. |
deactivate() | De beheerder deactiveert deze. |
install() | Eerste activering — maak tabellen aan, initialiseer instellingen. |
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, vrij delen, of verkopen via de marketplace, die ondertekende licenties en activering per domein toevoegt. 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.