Hooki i tworzenie wtyczek
Rozszerzaj TubePress za pomocą systemu hooków akcji i filtrów w stylu WordPressa: ponad 15 punktów zaczepienia, cykl życia wtyczki oraz jak zbudować i spakować własną wtyczkę.
Wtyczki to sposób na dodawanie funkcji do TubePress bez modyfikowania rdzenia. Podłączają się do CMS za pośrednictwem niewielkiego systemu wzorowanego na WordPress, opartego na akcjach (zdarzenia „wystrzel i zapomnij") i filtrach (modyfikują wartość i ją zwracają). Trzy dołączone wtyczki — Age Gate, Backup Pro i CTR Ranking — są zbudowane w całości przy użyciu tego samego API opisanego tutaj.
System hooków
Statyczna klasa HookSystem zarządza obydwoma rodzajami hooków. Wywołania zwrotne uruchamiane są w rosnącej kolejności priorytetu (domyślnie 10); wszelkie wyjątki zgłoszone przez wywołanie zwrotne są przechwytywane i logowane, dzięki czemu jedna uszkodzona wtyczka nie może zablokować strony.
// 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;
});| Metoda | Cel |
|---|---|
addAction($hook, $cb, $priority = 10) | Rejestruje nasłuchiwacz akcji. |
doAction($hook, ...$args) | Wywołuje akcję (rdzeń wywołuje te metody). |
addFilter($hook, $cb, $priority = 10) | Rejestruje filtr. |
applyFilter($hook, $value, ...$args) | Przepuszcza wartość przez filtry i ją zwraca. |
hasAction() / hasFilter() | Sprawdza, czy cokolwiek nasłuchuje. |
removeAction() / removeFilter() | Odłącza wszystkich słuchaczy dla hooka. |
Dostępne punkty hooków
Rdzeń uruchamia te hooki. Możesz też definiować i uruchamiać własne z poziomu wtyczki.
Akcje
| Hook | Kiedy się uruchamia |
|---|---|
head.meta | Wewnątrz <head>, po CSS — dodaj tagi meta, tagi weryfikacyjne itp. |
footer.scripts | Przed </body>, po JS — dodaj analitykę lub widżety. |
routes.registered | Po zarejestrowaniu wszystkich tras rdzenia, przed catch-all strony. |
router.before_dispatch | Tuż przed uruchomieniem dopasowanego handlera. Arg: rozwiązana ścieżka. |
Filtry
| Hook | Modyfikuje (argumenty) |
|---|---|
theme.template_data | Tablica danych przed renderowaniem szablonu. Argumenty: ($data, $templateName). |
head.css | Połączony ciąg wyjściowy CSS. |
footer.scripts | Połączony ciąg wyjściowy JS. |
video.card.html | Cały kod HTML karty wideo. Argumenty: ($html, $video). Zwróć niepusty ciąg, aby go zastąpić. |
Anatomia wtyczki
Wtyczka to folder w katalogu plugins/ zawierający manifest i klasę implementującą PluginInterface.
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, migrationsManifest odzwierciedla strukturę dołączonych wtyczek:
{
"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"
}Główna klasa implementuje sześć metod cyklu życia interfejsu PluginInterface:
| Metoda | Wywoływana kiedy |
|---|---|
boot() | Przy każdym żądaniu, gdy wtyczka jest aktywna — tu rejestruj hooki, trasy i zasoby. |
activate() | Administrator włącza wtyczkę. |
deactivate() | Administrator ją wyłącza. |
install() | Pierwsze uruchomienie — tworzenie tabel, inicjalizacja ustawień. |
uninstall() | Wtyczka jest usuwana — sprzątaj. |
info() | Zwraca dane manifestu jako tablicę. |
Rejestrowanie tras i zasobów
Całe połączenia wykonuj w metodzie 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);
}Zaplanowane zadania we wtyczce
Zarejestruj zadanie cykliczne za pomocą CronManager z poziomu metody boot() — działa na wbudowanym pseudo-cron, więc nie jest wymagany systemowy crontab. W ten sposób wtyczka CTR przelicza wyniki, a Backup Pro uruchamia zaplanowane kopie zapasowe.
Dołączone wtyczki jako wzorce
Dystrybucja i licencjonowanie
Możesz zachować wtyczkę jako prywatną, udostępniać ją swobodnie lub sprzedawać za pośrednictwem marketplace, który oferuje podpisane licencjonowanie i aktywację per domenę. Zobacz Tworzenie motywów jako odpowiednik po stronie prezentacji oraz Dokumentację API motywu dla wszystkiego dostępnego w kodzie szablonów.
Nadal masz problem?
Otwórz zgłoszenie z poziomu panelu, a nasz zespół Ci pomoże.