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öntem | Amaç |
|---|---|
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
| Hook | Ne 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.registered | Tüm çekirdek rotalar kaydedildikten sonra, sayfa catch-all öncesinde. |
router.before_dispatch | Eşleşen bir işleyici çalışmadan hemen önce. Arg: çözümlenen yol. |
Filtreler
| Hook | Değiştirilen (args) |
|---|---|
theme.template_data | Bir şablon render edilmeden önce veri dizisi. Args: ($data, $templateName). |
head.css | Birleştirilmiş CSS çıktı dizesi. |
footer.scripts | Birleştirilmiş JS çıktı dizesi. |
video.card.html | Tü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, migrationsManifest, 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öntem | Ne 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);
}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.