Hook & pengembangan plugin
Perluas TubePress dengan sistem hook action dan filter bergaya WordPress: 15+ titik hook, siklus hidup plugin, dan cara membangun serta mengemas plugin Anda sendiri.
Plugin adalah cara Anda menambahkan fitur ke TubePress tanpa menyentuh inti sistem. Plugin terhubung ke CMS melalui sistem bergaya WordPress yang sederhana berupa aksi (event sekali-kirim) dan filter (memodifikasi nilai dan mengembalikannya). Tiga plugin bawaan — Age Gate, Backup Pro, dan CTR Ranking — dibangun sepenuhnya menggunakan API yang sama yang didokumentasikan di sini.
Sistem hook
Kelas statis HookSystem mengelola kedua jenis hook. Callback dijalankan dalam urutan prioritas menaik (default 10); setiap exception yang dilempar oleh callback akan ditangkap dan dicatat, sehingga satu plugin yang bermasalah tidak akan pernah menjatuhkan halaman.
// 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;
});| Metode | Tujuan |
|---|---|
addAction($hook, $cb, $priority = 10) | Mendaftarkan listener aksi. |
doAction($hook, ...$args) | Memicu sebuah aksi (inti yang memanggilnya). |
addFilter($hook, $cb, $priority = 10) | Mendaftarkan filter. |
applyFilter($hook, $value, ...$args) | Menjalankan nilai melalui filter-nya dan mengembalikannya. |
hasAction() / hasFilter() | Memeriksa apakah ada yang mendengarkan. |
removeAction() / removeFilter() | Melepaskan semua listener untuk sebuah hook. |
Titik hook yang tersedia
Inti sistem memicu hook-hook ini. Anda juga dapat mendefinisikan dan memicu hook sendiri dari dalam sebuah plugin.
Aksi
| Hook | Kapan dipicu |
|---|---|
head.meta | Di dalam <head>, setelah CSS — tambahkan meta tag, verification tag, dll. |
footer.scripts | Sebelum </body>, setelah JS — tambahkan analitik atau widget. |
routes.registered | Setelah semua route inti terdaftar, sebelum catch-all halaman. |
router.before_dispatch | Tepat sebelum handler yang cocok dijalankan. Arg: path yang telah di-resolve. |
Filter
| Hook | Memodifikasi (args) |
|---|---|
theme.template_data | Array data sebelum template dirender. Args: ($data, $templateName). |
head.css | String output CSS yang digabungkan. |
footer.scripts | String output JS yang digabungkan. |
video.card.html | Seluruh HTML video-card. Args: ($html, $video). Kembalikan string yang tidak kosong untuk menggantinya. |
Anatomi sebuah plugin
Plugin adalah sebuah folder di bawah plugins/ dengan sebuah manifest dan sebuah kelas yang mengimplementasikan 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, migrationsManifest ini mencerminkan plugin-plugin bawaan:
{
"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"
}Kelas utama mengimplementasikan enam metode siklus hidup dari PluginInterface:
| Metode | Dipanggil saat |
|---|---|
boot() | Setiap permintaan selama plugin aktif — daftarkan hook, route, dan aset di sini. |
activate() | Admin mengaktifkan plugin. |
deactivate() | Admin menonaktifkan plugin. |
install() | Aktivasi pertama — buat tabel, isi pengaturan awal. |
uninstall() | Plugin dihapus — lakukan pembersihan. |
info() | Mengembalikan data manifest sebagai array. |
Mendaftarkan route & aset
Lakukan semua pengaturan di 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);
}Pekerjaan terjadwal dalam plugin
Daftarkan tugas berulang dengan CronManager dari boot() — ia berjalan pada pseudo-cron bawaan, sehingga tidak diperlukan crontab sistem. Inilah cara plugin CTR menghitung ulang skor dan Backup Pro menjalankan backup terjadwal.
Plugin bawaan sebagai referensi
Distribusi & lisensi
Anda dapat menyimpan plugin secara privat, membagikannya secara bebas, atau menjualnya melalui marketplace, yang menambahkan lisensi bertanda tangan dan aktivasi per-domain. Lihat Pengembangan tema untuk padanannya di sisi presentasi, dan Referensi Theme API untuk semua yang tersedia untuk kode template.
Masih kesulitan?
Buka tiket dari dasbor Anda dan tim kami akan membantu Anda.