Sviluppo di temi
Crea il tuo tema: struttura, theme.json, functions.php, template e helper.
Un tema TubePress è una cartella di template PHP con risorse opzionali e funzioni di supporto. Ricorri a un tema personalizzato quando Aspetto e l'editor di tema non sono sufficienti e desideri il pieno controllo del markup. Questa pagina è la guida alla creazione; tieni aperto il riferimento API del tema accanto ad essa per l'elenco esaustivo di variabili e helper.
La regola d'oro: leggi le impostazioni che TubePress inietta invece di codificarle a mano. Se rispetti le variabili con prefisso $_, il tuo tema rimane completamente configurabile dall'admin, esattamente come il tema Simply incluso.
Struttura del tema
I temi risiedono in themes/{slug}/. Solo theme.json e templates/layout.php sono strettamente necessari — tutto il resto è facoltativo e ricade su Simply.
themes/aurora/
├── theme.json Required — metadata
├── functions.php Enqueue assets, helper functions
├── assets/
│ ├── css/style.css
│ └── js/app.js
└── templates/
├── layout.php Required — the HTML shell
├── home.php Homepage
├── video.php Watch page
├── category.php …tag/performer/channel (+ plurals)
├── search.php Search results
├── page.php Static page
├── favorites.php User favourites
├── history.php Watch history
├── 404.php Not found
├── auth/ login, register, profile
└── partials/
└── video-card.php Reusable card partialtheme.json
Questo manifest è obbligatorio. Contiene i metadati del tema, un insieme di colori predefiniti opzionale e impostazioni arbitrarie. name, version e author appaiono in /admin/themes.
{
"name": "Aurora",
"description": "A custom theme for TubePress",
"version": "1.0.0",
"author": "Your Name",
"screenshot": "screenshot.png",
"supports": ["subscriptions", "member_uploads", "pwa"],
"colors": {
"primary": "#2563eb",
"secondary": "#7c3aed",
"background": "#ffffff",
"text": "#1e293b"
},
"settings": {
"videos_per_row": 4
}
}Funzionalità facoltative: supports
Da TubePress 1.2, un tema attiva le funzionalità community con l’elenco supports. Una funzionalità attivata nelle Impostazioni resta invisibile su un tema che non la dichiara, quindi aggiungi un flag solo quando i tuoi template la gestiscono:
| Flag | Cosa fornisce il tuo tema |
|---|---|
subscriptions | I pulsanti Iscriviti in channel.php e video.php (leggi $subscriptionsOn, $isSubscribed e $subscriberCount) e la scheda Iscrizioni di auth/profile.php. |
member_uploads | Il template upload.php — senza il flag, /upload risponde 404 — e la scheda I miei video di auth/profile.php. |
pwa | Niente da costruire: il core aggiunge manifest, service worker e banner di installazione tramite gli hook head.meta e footer.scripts. Dichiaralo quando il tuo layout mostra le voci Installa l’app (qualsiasi elemento con data-pwa-install). |
Simply e Hentai Noir dichiarano tutti e tre i flag, quindi i loro template sono il miglior punto di partenza. Tutte le variabili coinvolte sono elencate nel riferimento dell’API dei temi.
functions.php
Questo file viene caricato automaticamente all'avvio. Usalo per accodare il foglio di stile e lo script e per definire le funzioni di supporto chiamate dai tuoi template. Accoda le risorse con una query string filemtime() in modo che i browser rilevino sempre l'ultima modifica; il secondo argomento è la priorità di caricamento (valori più bassi caricano prima).
<?php
declare(strict_types=1);
// filemtime() busts the cache on every edit.
$cssVer = @filemtime(ThemeManager::themePath()
. '/assets/css/style.css') ?: time();
$jsVer = @filemtime(ThemeManager::themePath()
. '/assets/js/app.js') ?: time();
ThemeRenderer::enqueueCSS(
ThemeManager::assetUrl('css/style.css') . '?v=' . $cssVer, 1);
ThemeRenderer::enqueueJS(
ThemeManager::assetUrl('js/app.js') . '?v=' . $jsVer, 1);
// A reusable video-card helper, called from listing templates.
function auroraVideoCard(array $video): string
{
// Record an impression so the CTR system can rank this card.
ImpressionTracker::collect((int) $video['id']);
// Let a plugin replace the card entirely if it wants to.
$card = HookSystem::applyFilter('video.card.html', '', $video);
if ($card !== '') {
return $card;
}
ob_start();
require ThemeManager::templatePath('partials/video-card');
return ob_get_clean();
}Simply definisce esattamente questo tipo di helper — simplyVideoCard() — insieme a simplyPagination() e simplySortTabs(). La chiamata a ImpressionTracker::collect() alimenta il ranking CTR; la scrittura in batch viene scaricata in seguito in layout.php.
partials/video-card.php tramite ThemeManager::templatePath() e l'output buffering, come sopra. Mantiene il markup in un unico punto e permette ai plugin di sovrascriverlo tramite il filtro video.card.html.Template & flusso di rendering
Un controller passa i dati a ThemeRenderer::render($template, $data), e il renderer si occupa del resto. Capire l'ordine aiuta a sapere cosa è disponibile e dove.
- Il controller effettua il rendering. Es.
ThemeRenderer::render('home', ['videos' => $videos]). - Le variabili globali vengono iniettate. Le variabili con prefisso
$_di sito, aspetto, lingua e card/watch vengono aggiunte. - I plugin modificano i dati. Il filtro
theme.template_dataviene eseguito, ricevendo($data, $templateName). - Il tuo template viene bufferizzato. Il file template viene catturato in
$content. - Il layout viene caricato.
layout.phpriceve$contentpiù tutte le variabili e genera il guscio HTML completo. - Le impressioni vengono scaricate.
ImpressionTracker::flush()scrive l'aggiornamento CTR in batch prima di</body>. - Il cron viene eseguito.
CronManager::run()esegue le attività pianificate in scadenza.
Il tuo layout.php è responsabile del guscio: includi ThemeRenderer::renderCSS() e $_colorOverrides in <head>, usa echo su $content, poi chiama ThemeRenderer::renderJS() e ImpressionTracker::flush() prima di </body>. L'API del tema elenca la lista di controllo completa in otto punti.
Variabili globali e helper
Ogni template riceve le variabili globali $_ più i propri dati. Il riferimento API del tema le documenta tutte; queste sono quelle che utilizzerai più spesso.
| Variabili più utilizzate | Utilizzo |
|---|---|
$_siteName, $_siteUrl, $_user | Identità e l'utente connesso (o null). |
$_videosPerRow | Colonne della griglia (4, 5 o 6) per i tuoi elenchi. |
$_colorOverrides | Il blocco <style> delle proprietà CSS personalizzate dei colori per <head>. |
$_card*, $_watch* | Le opzioni di card e pagina di visione impostate in Aspetto. |
$_menuItems, $_menuSearch | Voci di navigazione e l'opzione della barra di ricerca. |
| Helper principali | Utilizzo |
|---|---|
ThemeRenderer | ::enqueueCSS/::enqueueJS, ::partial, ::renderCSS/::renderJS. |
ThemeManager | ::assetUrl, ::themePath, ::templatePath, ::active. |
Format | ::number, ::duration, ::timeAgo per la visualizzazione. |
Router / url() | URL, più ::csrfField() per i form. |
Setting, __() | Leggi un'impostazione; traduci una chiave. |
Fallback dei template
Se il tema attivo manca di un template, TubePress utilizza la copia di Simply al suo posto. Ciò significa che devi sovrascrivere solo ciò che vuoi cambiare: inizia copiando un singolo template — ad esempio home.php — nel tuo tema, e lascia che tutto il resto erediti da Simply finché non sei pronto a prenderne il controllo. Un tema può essere composto da un file o da cinquanta.
Hook del tema
Oltre ai template, un piccolo insieme di punti di hook permette a te (e ai plugin) di estendere la pagina senza doverla forkare. Le action sono fire-and-forget; i filter trasformano un valore che restituisci.
| Hook | Tipo | Scopo |
|---|---|---|
head.meta | Action | Emette tag all'interno di <head> (meta, JSON-LD, verifica). |
footer.scripts | Action | Emette markup subito prima di </body>. |
video.card.html | Filter | Sostituisce l'HTML di una card. Argomenti ($html, $video); restituisce una stringa non vuota per sovrascrivere. |
// An action — fire and forget, inside <head>.
HookSystem::doAction('head.meta');
// A filter — return '' to keep the default card.
HookSystem::addFilter('video.card.html',
function (string $html, array $video): string {
return $html;
});Vale la pena conoscere altri due filtri: theme.template_data per modificare l'array di dati prima del rendering, e head.css per aggiungere una stringa <style> — Simply usa quest'ultimo per pubblicare il gap della griglia e il raggio come variabili CSS. Per il catalogo più ampio di action/filter, vedi hook e plugin.
Passi successivi
Ancora bloccato?
Apri un ticket dalla tua dashboard e il nostro team ti aiuterà.