Zum Inhalt springen
TubePress — kostenlos, selbst gehostet & aktiv gepflegt
Entwicklerreferenz

Hooks & Plugin-Entwicklung

Erweitern Sie TubePress mit seinem WordPress-artigen Action- und Filter-Hook-System: über 15 Hook-Punkte, der Plugin-Lebenszyklus und wie Sie Ihr eigenes Plugin erstellen und verpacken.

Plugins sind der Weg, wie Sie TubePress Funktionen hinzufügen, ohne den Core zu berühren. Sie klinken sich über ein kleines WordPress-artiges System aus Aktionen (Einweg-Ereignisse) und Filtern (Wert ändern und zurückgeben) in das CMS ein. Die drei mitgelieferten Plugins — Age Gate, Backup Pro und CTR Ranking — sind vollständig mit derselben hier dokumentierten API erstellt.

Das Hook-System

Die statische Klasse HookSystem verwaltet beide Hook-Typen. Callbacks werden in aufsteigender Prioritätsreihenfolge ausgeführt (Standard 10); jede von einem Callback ausgelöste Ausnahme wird abgefangen und protokolliert, sodass ein fehlerhaftes Plugin niemals die Seite zum Absturz bringen kann.

// 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;
});
MethodeZweck
addAction($hook, $cb, $priority = 10)Einen Aktions-Listener registrieren.
doAction($hook, ...$args)Eine Aktion auslösen (wird vom Core aufgerufen).
addFilter($hook, $cb, $priority = 10)Einen Filter registrieren.
applyFilter($hook, $value, ...$args)Einen Wert durch seine Filter laufen lassen und zurückgeben.
hasAction() / hasFilter()Prüfen, ob etwas zuhört.
removeAction() / removeFilter()Alle Listener für einen Hook entfernen.

Verfügbare Hook-Punkte

Der Core löst diese Hooks aus. Sie können auch eigene aus einem Plugin heraus definieren und auslösen.

Aktionen

HookWann es ausgelöst wird
head.metaInnerhalb von <head>, nach dem CSS — Meta-Tags, Verifizierungs-Tags usw. hinzufügen.
footer.scriptsVor </body>, nach dem JS — Analysetools oder Widgets hinzufügen.
routes.registeredNachdem alle Core-Routen registriert wurden, vor dem Seiten-Catch-All.
router.before_dispatchKurz bevor ein gefundener Handler ausgeführt wird. Arg: der aufgelöste Pfad.

Filter

HookVerändert (Args)
theme.template_dataDas Daten-Array, bevor ein Template gerendert wird. Args: ($data, $templateName).
head.cssDer kombinierte CSS-Ausgabe-String.
footer.scriptsDer kombinierte JS-Ausgabe-String.
video.card.htmlDas gesamte Video-Karten-HTML. Args: ($html, $video). Einen nicht leeren String zurückgeben, um es zu ersetzen.

Aufbau eines Plugins

Ein Plugin ist ein Ordner unter plugins/ mit einem Manifest und einer Klasse, die PluginInterface implementiert.

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

Das Manifest spiegelt die mitgelieferten Plugins wider:

{
  "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"
}

Die Hauptklasse implementiert die sechs Lebenszyklus-Methoden von PluginInterface:

MethodeWann aufgerufen
boot()Bei jeder Anfrage, solange das Plugin aktiv ist — Hooks, Routen und Assets hier registrieren.
activate()Der Administrator aktiviert das Plugin.
deactivate()Der Administrator deaktiviert es.
install()Erste Aktivierung — Tabellen erstellen, Einstellungen vorbelegen.
uninstall()Das Plugin wird entfernt — aufräumen.
info()Gibt die Manifest-Daten als Array zurück.

Routen & Assets registrieren

Nehmen Sie alle Verknüpfungen in boot() vor:

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);
}
Eigenständig per Design. Ein Plugin sollte alles hinzufügen, was es benötigt — eigenes Schema, Einstellungen, Routen, Admin-Seiten und geplante Aufgaben — und diese bei der Deinstallation wieder entfernen, ohne Änderungen am Basis-CMS vorzunehmen. Das CTR Ranking-Plugin ist ein gutes Beispiel dafür.

Geplante Aufgaben in einem Plugin

Registrieren Sie eine wiederkehrende Aufgabe mit dem CronManager aus boot() heraus — er läuft auf dem eingebauten Pseudo-Cron, sodass kein System-Crontab erforderlich ist. So berechnet das CTR-Plugin Punktzahlen neu und Backup Pro führt geplante Sicherungen durch.

Mitgelieferte Plugins als Referenz

Verteilung & Lizenzierung

Sie können ein Plugin privat halten, es frei teilen oder es über den Marktplatz verkaufen, der signierte Lizenzierung und domänenspezifische Aktivierung hinzufügt. Siehe Theme-Entwicklung für das Äquivalent auf der Präsentationsseite und die Theme-API-Referenz für alles, was Template-Code zur Verfügung steht.

Noch Hilfe benötigt?

Erstellen Sie ein Ticket in Ihrem Dashboard und unser Team hilft Ihnen gerne weiter.

Live-Demo ausprobieren → TubePress herunterladen →