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;
});| Metodo | Scopo |
|---|---|
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
| Hook | Quando si attiva |
|---|---|
head.meta | Dentro <head>, dopo il CSS — aggiunge meta tag, tag di verifica, ecc. |
footer.scripts | Prima di </body>, dopo il JS — aggiunge analytics o widget. |
routes.registered | Dopo che tutte le route del core sono state registrate, prima del catch-all della pagina. |
router.before_dispatch | Subito prima che venga eseguito un handler corrispondente. Argomento: il percorso risolto. |
Filtri
| Hook | Modifica (argomenti) |
|---|---|
theme.template_data | L'array di dati prima che un template venga renderizzato. Argomenti: ($data, $templateName). |
head.css | La stringa di output CSS combinata. |
footer.scripts | La stringa di output JS combinata. |
video.card.html | L'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, migrationsIl 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:
| Metodo | Chiamato 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);
}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à.