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;
});| Methode | Zweck |
|---|---|
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
| Hook | Wann es ausgelöst wird |
|---|---|
head.meta | Innerhalb von <head>, nach dem CSS — Meta-Tags, Verifizierungs-Tags usw. hinzufügen. |
footer.scripts | Vor </body>, nach dem JS — Analysetools oder Widgets hinzufügen. |
routes.registered | Nachdem alle Core-Routen registriert wurden, vor dem Seiten-Catch-All. |
router.before_dispatch | Kurz bevor ein gefundener Handler ausgeführt wird. Arg: der aufgelöste Pfad. |
Filter
| Hook | Verändert (Args) |
|---|---|
theme.template_data | Das Daten-Array, bevor ein Template gerendert wird. Args: ($data, $templateName). |
head.css | Der kombinierte CSS-Ausgabe-String. |
footer.scripts | Der kombinierte JS-Ausgabe-String. |
video.card.html | Das 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, migrationsDas 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:
| Methode | Wann 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);
}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.