Przejdź do treści
TubePress — bezpłatny, samodzielnie hostowany & aktywnie utrzymywany
Dokumentacja dla deweloperów

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

HookKiedy się uruchamia
head.metaWewnątrz <head>, po CSS — dodaj tagi meta, tagi weryfikacyjne itp.
footer.scriptsPrzed </body>, po JS — dodaj analitykę lub widżety.
routes.registeredPo zarejestrowaniu wszystkich tras rdzenia, przed catch-all strony.
router.before_dispatchTuż przed uruchomieniem dopasowanego handlera. Arg: rozwiązana ścieżka.

Filtry

HookModyfikuje (argumenty)
theme.template_dataTablica danych przed renderowaniem szablonu. Argumenty: ($data, $templateName).
head.cssPołączony ciąg wyjściowy CSS.
footer.scriptsPołączony ciąg wyjściowy JS.
video.card.htmlCał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, migrations

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

MetodaWywoł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);
}
Samowystarczalny z założenia. Wtyczka powinna dodawać wszystko, czego potrzebuje — własny schemat bazy danych, ustawienia, trasy, strony admina i zaplanowane zadania — oraz usuwać je podczas dezinstalacji, bez wprowadzania zmian w bazowym CMS. Wtyczka CTR Ranking jest dobrym wzorem do naśladowania.

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.

Wypróbuj demo na żywo → Pobierz TubePress →