Saltar al contenido
TubePress — gratuito, autoalojado & con mantenimiento activo
Referencia para desarrolladores

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étodoPropó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

HookCuándo se dispara
head.metaDentro de <head>, después del CSS — añade etiquetas meta, etiquetas de verificación, etc.
footer.scriptsAntes de </body>, después del JS — añade analíticas o widgets.
routes.registeredDespués de registrar todas las rutas del núcleo, antes del catch-all de página.
router.before_dispatchJusto antes de que se ejecute un manejador coincidente. Arg: la ruta resuelta.

Filtros

HookModifica (args)
theme.template_dataEl array de datos antes de que se renderice una plantilla. Args: ($data, $templateName).
head.cssLa cadena de salida CSS combinada.
footer.scriptsLa cadena de salida JS combinada.
video.card.htmlEl 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, migrations

El 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étodoCuá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);
}
Autocontenido por diseño. Un plugin debe agregar todo lo que necesita — su propio esquema, configuración, rutas, páginas de administración y tareas programadas — y eliminarlos en la desinstalación, sin cambios en el CMS base. El plugin CTR Ranking es un buen modelo de esto.

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á.

Prueba la demo en vivo → Descargar TubePress →