Vai al contenuto
TubePress — gratuito, self-hosted & attivamente mantenuto
Riferimento per sviluppatori

Hook e sviluppo di plugin

Estendi TubePress con il suo sistema di hook action e filter in stile WordPress: oltre 15 punti di hook, il ciclo di vita dei plugin e come creare e impacchettare il tuo plugin.

I plugin sono il modo per aggiungere funzionalità a TubePress senza toccare il core. Si integrano nel CMS tramite un piccolo sistema in stile WordPress di azioni (eventi fire-and-forget) e filtri (modificano un valore e lo restituiscono). I tre plugin inclusi — Age Gate, Backup Pro e CTR Ranking — sono costruiti interamente con la stessa API documentata qui.

Il sistema di hook

La classe statica HookSystem gestisce entrambi i tipi di hook. I callback vengono eseguiti in ordine di priorità crescente (predefinito 10); qualsiasi eccezione generata da un callback viene catturata e registrata, quindi un plugin difettoso non può mai mandare in crash la pagina.

// 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;
});
MetodoScopo
addAction($hook, $cb, $priority = 10)Registra un listener di azione.
doAction($hook, ...$args)Attiva un'azione (il core chiama queste).
addFilter($hook, $cb, $priority = 10)Registra un filtro.
applyFilter($hook, $value, ...$args)Esegue un valore attraverso i suoi filtri e lo restituisce.
hasAction() / hasFilter()Verifica se c'è qualcosa in ascolto.
removeAction() / removeFilter()Rimuove tutti i listener per un hook.

Punti di hook disponibili

Il core attiva questi hook. Puoi anche definire e attivare i tuoi da un plugin.

Azioni

HookQuando si attiva
head.metaDentro <head>, dopo il CSS — aggiunge meta tag, tag di verifica, ecc.
footer.scriptsPrima di </body>, dopo il JS — aggiunge analytics o widget.
routes.registeredDopo che tutte le route del core sono state registrate, prima del catch-all della pagina.
router.before_dispatchSubito prima che venga eseguito un handler corrispondente. Argomento: il percorso risolto.

Filtri

HookModifica (argomenti)
theme.template_dataL'array di dati prima che un template venga renderizzato. Argomenti: ($data, $templateName).
head.cssLa stringa di output CSS combinata.
footer.scriptsLa stringa di output JS combinata.
video.card.htmlL'intero HTML del video-card. Argomenti: ($html, $video). Restituisci una stringa non vuota per sostituirlo.

Anatomia di un plugin

Un plugin è una cartella sotto plugins/ con un manifest e una classe che implementa 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

Il manifest rispecchia i plugin inclusi:

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

La classe principale implementa i sei metodi del ciclo di vita di PluginInterface:

MetodoChiamato quando
boot()Ogni richiesta mentre il plugin è attivo — registra hook, route e asset qui.
activate()L'amministratore abilita il plugin.
deactivate()L'amministratore lo disabilita.
install()Prima attivazione — crea tabelle, inizializza le impostazioni.
uninstall()Il plugin viene rimosso — esegui la pulizia.
info()Restituisce i dati del manifest come array.

Registrazione di route e asset

Effettua tutto il collegamento 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);
}
Autonomo per design. Un plugin dovrebbe aggiungere tutto ciò di cui ha bisogno — il proprio schema, impostazioni, route, pagine di amministrazione e attività pianificate — e rimuoverli di nuovo alla disinstallazione, senza modifiche al CMS di base. Il plugin CTR Ranking è un buon modello di questo.

Attività pianificate in un plugin

Registra un'attività ricorrente con il CronManager da boot() — viene eseguita sul pseudo-cron integrato, quindi non è richiesto alcun crontab di sistema. È così che il plugin CTR ricalcola i punteggi e Backup Pro esegue i backup pianificati.

Plugin inclusi come riferimento

Distribuzione e licenza

Puoi mantenere un plugin privato, condividerlo liberamente, o venderlo tramite il marketplace, che aggiunge licenze firmate e attivazione per dominio. Consulta Sviluppo del tema per l'equivalente sul lato presentazione, e il Riferimento API del tema per tutto ciò che è disponibile al codice dei template.

Ancora bloccato?

Apri un ticket dalla tua dashboard e il nostro team ti aiuterà.

Prova la demo live → Scarica TubePress →