Hooks y desarrollo de plugins
Amplía TubePress con su sistema de hooks de acción y filtro al estilo de WordPress: más de 15 puntos de hook, el ciclo de vida de los plugins y cómo crear y empaquetar tu propio plugin.
Los plugins son la forma de agregar funciones a TubePress sin tocar el núcleo. Se conectan al CMS a través de un pequeño sistema de estilo WordPress de acciones (eventos de disparar y olvidar) y filtros (modificar un valor y devolverlo). Los tres plugins incluidos — Age Gate, Backup Pro y CTR Ranking — están construidos íntegramente con la misma API documentada aquí.
El sistema de hooks
La clase estática HookSystem gestiona ambos tipos de hook. Los callbacks se ejecutan en orden de prioridad ascendente (por defecto 10); cualquier excepción que lance un callback se captura y registra, de modo que un plugin defectuoso nunca puede tumbar la página.
// 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;
});| Método | Propósito |
|---|---|
addAction($hook, $cb, $priority = 10) | Registrar un listener de acción. |
doAction($hook, ...$args) | Disparar una acción (el núcleo las llama). |
addFilter($hook, $cb, $priority = 10) | Registrar un filtro. |
applyFilter($hook, $value, ...$args) | Pasar un valor por sus filtros y devolverlo. |
hasAction() / hasFilter() | Comprobar si hay algo escuchando. |
removeAction() / removeFilter() | Desconectar todos los listeners de un hook. |
Puntos de hook disponibles
El núcleo dispara estos hooks. También puedes definir y disparar los tuyos propios desde un plugin.
Acciones
| Hook | Cuándo se dispara |
|---|---|
head.meta | Dentro de <head>, después del CSS — añade etiquetas meta, etiquetas de verificación, etc. |
footer.scripts | Antes de </body>, después del JS — añade analíticas o widgets. |
routes.registered | Después de registrar todas las rutas del núcleo, antes del catch-all de página. |
router.before_dispatch | Justo antes de que se ejecute un manejador coincidente. Arg: la ruta resuelta. |
Filtros
| Hook | Modifica (args) |
|---|---|
theme.template_data | El array de datos antes de que se renderice una plantilla. Args: ($data, $templateName). |
head.css | La cadena de salida CSS combinada. |
footer.scripts | La cadena de salida JS combinada. |
video.card.html | El HTML completo de la tarjeta de vídeo. Args: ($html, $video). Devuelve una cadena no vacía para reemplazarlo. |
Anatomía de un plugin
Un plugin es una carpeta dentro de plugins/ con un manifiesto y una clase que 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, migrationsEl manifiesto refleja los plugins incluidos:
{
"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 clase principal implementa los seis métodos del ciclo de vida de PluginInterface:
| Método | Cuándo se llama |
|---|---|
boot() | Cada solicitud mientras el plugin está activo — registra hooks, rutas y activos aquí. |
activate() | El administrador activa el plugin. |
deactivate() | El administrador lo desactiva. |
install() | Primera activación — crea las tablas e inicializa la configuración. |
uninstall() | El plugin se elimina — limpieza. |
info() | Devuelve los datos del manifiesto como un array. |
Registro de rutas y activos
Realiza toda tu configuración en 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);
}Trabajo programado en un plugin
Registra una tarea recurrente con el CronManager desde boot() — se ejecuta en el pseudo-cron integrado, por lo que no se requiere un crontab del sistema. Así es como el plugin CTR recalcula las puntuaciones y Backup Pro ejecuta las copias de seguridad programadas.
Plugins incluidos como referencia
Distribución y licencias
Puedes mantener un plugin privado, compartirlo libremente, o venderlo a través del marketplace, que añade licencias firmadas y activación por dominio. Consulta Desarrollo de temas para el equivalente en el lado de presentación, y la referencia de Theme API para todo lo disponible en el código de plantillas.
¿Todavía con dudas?
Abre un ticket desde tu panel y nuestro equipo te ayudará.