İçeriğe atla
TubePress — ücretsiz, kendi sunucunda & aktif olarak geliştirilen
Geliştirici referansı

Kancalar ve eklenti geliştirme

TubePress'i WordPress tarzı eylem (action) ve filtre (filter) kanca sistemiyle genişletin: 15'ten fazla kanca noktası, eklenti yaşam döngüsü ve kendi eklentinizi nasıl oluşturup paketleyeceğiniz.

Eklentiler, TubePress'e çekirdeğe dokunmadan özellik eklemenin yoludur. CMS'e WordPress benzeri küçük bir sistemle bağlanırlar: eylemler (gönder-ve-unut olayları) ve filtreler (bir değeri değiştirip döndürme). Dahili üç eklenti — Age Gate, Backup Pro ve CTR Ranking — tamamen burada belgelenen API ile oluşturulmuştur.

Hook sistemi

Statik HookSystem sınıfı her iki hook türünü de yönetir. Geri çağırmalar öncelik sırasına göre artan şekilde çalışır (varsayılan 10); bir geri çağırmanın fırlattığı tüm istisnalar yakalanıp kaydedilir, böylece hatalı bir eklenti sayfayı asla çökertmez.

// 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;
});
YöntemAmaç
addAction($hook, $cb, $priority = 10)Bir eylem dinleyicisi kaydeder.
doAction($hook, ...$args)Bir eylem tetikler (çekirdek bunları çağırır).
addFilter($hook, $cb, $priority = 10)Bir filtre kaydeder.
applyFilter($hook, $value, ...$args)Bir değeri filtreleri üzerinden çalıştırır ve döndürür.
hasAction() / hasFilter()Herhangi bir şeyin dinleyip dinlemediğini kontrol eder.
removeAction() / removeFilter()Bir hook için tüm dinleyicileri kaldırır.

Kullanılabilir hook noktaları

Çekirdek bu hook'ları tetikler. Ayrıca bir eklenti içinden kendi hook'larınızı tanımlayabilir ve tetikleyebilirsiniz.

Eylemler

HookNe zaman tetiklenir
head.meta<head> içinde, CSS'in ardından — meta etiketleri, doğrulama etiketleri vb. ekleyin.
footer.scripts</body> öncesinde, JS'in ardından — analitik veya widget'lar ekleyin.
routes.registeredTüm çekirdek rotalar kaydedildikten sonra, sayfa catch-all öncesinde.
router.before_dispatchEşleşen bir işleyici çalışmadan hemen önce. Arg: çözümlenen yol.

Filtreler

HookDeğiştirilen (args)
theme.template_dataBir şablon render edilmeden önce veri dizisi. Args: ($data, $templateName).
head.cssBirleştirilmiş CSS çıktı dizesi.
footer.scriptsBirleştirilmiş JS çıktı dizesi.
video.card.htmlTüm video kart HTML'si. Args: ($html, $video). Değiştirmek için boş olmayan bir dize döndürün.

Bir eklentinin anatomisi

Bir eklenti, plugins/ altında bir manifest ve PluginInterface uygulayan bir sınıf içeren bir klasördür.

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, dahili eklentileri yansıtır:

{
  "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"
}

Ana sınıf, PluginInterface'in altı yaşam döngüsü yöntemini uygular:

YöntemNe zaman çağrılır
boot()Eklenti etkinken her istek — hook'ları, rotaları ve varlıkları burada kaydedin.
activate()Yönetici eklentiyi etkinleştirir.
deactivate()Yönetici onu devre dışı bırakır.
install()İlk etkinleştirme — tablolar oluşturun, başlangıç ayarlarını yapın.
uninstall()Eklenti kaldırılır — temizleyin.
info()Manifest verilerini dizi olarak döndürür.

Rotaları & varlıkları kaydetme

Tüm bağlantılarınızı boot() içinde yapın:

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);
}
Tasarım gereği bağımsız. Bir eklenti, ihtiyaç duyduğu her şeyi — kendi şeması, ayarları, rotaları, yönetici sayfaları ve zamanlanmış görevleri — eklemeli ve kaldırma sırasında bunları tekrar silmeli; temel CMS'de herhangi bir değişiklik yapılmamalıdır. CTR Ranking eklentisi bunun iyi bir modelidir.

Bir eklentide zamanlanmış çalışma

boot() içinden CronManager ile tekrarlayan bir görev kaydedin — yerleşik pseudo-cron üzerinde çalışır, bu nedenle sistem crontab'ı gerekmez. CTR eklentisi puanları böyle yeniden hesaplar ve Backup Pro zamanlanmış yedeklemeleri bu şekilde çalıştırır.

Referans olarak dahili eklentiler

Dağıtım & lisanslama

Bir eklentiyi özel tutabilir, özgürce paylaşabilir veya imzalı lisanslama ve alan adı başına etkinleştirme ekleyen marketplace üzerinden satabilirsiniz. Sunum tarafındaki eşdeğeri için Tema geliştirme'ye ve şablon kodunda kullanılabilecek her şey için Tema API referansı'na bakın.

Hâlâ takıldınız mı?

Kontrol panelinizden bir destek talebi açın, ekibimiz size yardımcı olacaktır.

Canlı demoyu deneyin → TubePress'i indirin →