Lewati ke konten
TubePress — gratis, self-hosted & aktif dikembangkan
Referensi pengembang

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;
});
MetodeTujuan
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

HookKapan dipicu
head.metaDi dalam <head>, setelah CSS — tambahkan meta tag, verification tag, dll.
footer.scriptsSebelum </body>, setelah JS — tambahkan analitik atau widget.
routes.registeredSetelah semua route inti terdaftar, sebelum catch-all halaman.
router.before_dispatchTepat sebelum handler yang cocok dijalankan. Arg: path yang telah di-resolve.

Filter

HookMemodifikasi (args)
theme.template_dataArray data sebelum template dirender. Args: ($data, $templateName).
head.cssString output CSS yang digabungkan.
footer.scriptsString output JS yang digabungkan.
video.card.htmlSeluruh 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, migrations

Manifest 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:

MetodeDipanggil 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);
}
Mandiri secara desain. Sebuah plugin sebaiknya menambahkan semua yang dibutuhkannya — schema-nya sendiri, pengaturan, route, halaman admin, dan tugas terjadwal — dan menghapusnya kembali saat di-uninstall, tanpa mengubah CMS dasar. Plugin CTR Ranking adalah contoh yang baik untuk ini.

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.

Coba demo langsung → Unduh TubePress →