Ga naar inhoud
TubePress — gratis, zelf gehost & actief onderhouden
Ontwikkelaarsreferentie

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;
});
MethodeDoel
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

HookWanneer het wordt geactiveerd
head.metaBinnenin <head>, na de CSS — voeg meta-tags, verificatietags, enz. toe.
footer.scriptsVoor </body>, na de JS — voeg analytics of widgets toe.
routes.registeredNadat alle kernroutes zijn geregistreerd, vóór de algehele pagina-afhandeling.
router.before_dispatchNet voor een gematchte handler wordt uitgevoerd. Arg: het opgeloste pad.

Filters

HookWijzigt (args)
theme.template_dataDe data-array vóór het renderen van een template. Args: ($data, $templateName).
head.cssDe gecombineerde CSS-uitvoerstring.
footer.scriptsDe gecombineerde JS-uitvoerstring.
video.card.htmlDe 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, migrations

Het 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:

MethodeAangeroepen 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);
}
Zelfvoorzienend door ontwerp. Een plugin moet alles toevoegen wat het nodig heeft — zijn eigen schema, instellingen, routes, beheerpagina's en geplande taken — en deze bij het verwijderen ook weer opruimen, zonder wijzigingen aan het basis-CMS. De CTR Ranking-plugin is een goed voorbeeld hiervan.

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.

Probeer de live demo → TubePress downloaden →