Açık Kaynak · Ata
WordPress eklentinize güç katın.
MVC-S yapısıyla.
ATA, WordPress eklenti geliştiricilerinin büyüyen kod tabanlarını MVC tasarım deseniyle düzenli ve sürdürülebilir tutmasına yardımcı olur.
WordPress eklenti geliştiricileri için
Her şey için bir klasör.
ATA her eklentiye aynı öngörülebilir yapıyı kazandırır; böylece büyüyen kod tabanları düzenli ve sürdürülebilir kalır.
ATA Folder STRUCTURE
your-plugin-name/
├── app/
│ ├── apis/ # REST API endpoint classes
│ ├── controllers/ # Controller classes
│ ├── helpers/ # Global helper functions
│ ├── models/ # Data logic (database interaction)
│ │ └── structures/ # Optional: DTOs/data structure classes
│ ├── routes/ # API and custom URL definitions
│ ├── services/ # Business logic layer
│ └── views/ # View files (HTML/PHP templates)
│
├── base/ # Base classes your app classes extend
├── config/ # Plugin-wide configuration
├── constants/ # Custom constant definitions
├── inc/ # Bootstrapping and initialization files
├── vendor/ # Composer dependencies (includes the core ATA framework)
│
└── your-plugin-name.php # The main plugin entry file
Ata’nın temel ilkeleri.
Varsayılan olarak yapılandırılmış
ATA, eklentinizin farklı bölümlerini mantıksal olarak birbirinden ayıran, önceden tanımlanmış bir dizin yapısı sunar.
Önce nesne yönelimli
Prosedürel fonksiyonlar yerine sınıflarla kod yazmayı teşvik ederek kodun yeniden kullanılabilirliğini ve düzenini iyileştirir.
Sorumlulukların net ayrımı
Mantık, veri ve sunum katmanlarınızın birbirinden ayrı kalmasını sağlamak için MVC deseninin bir varyasyonunu uygular.
Sadeleştirilmiş yönlendirme
ATA, özel REST API endpoint’lerini veya özel URL’leri kaydetmeyi basit ve bildirimsel hale getiren yerleşik bir router içerir.
Temel farklar
MVC-S nedir?
ATA, Model-View-Controller (MVC) deseninin bir varyantını benimser; biz buna MVC-S (Model-View-Controller-Services) diyoruz.
Controller (Merkezi motor)
Controller, eklentinizin işleyişinin çekirdeğidir. Gelen istekleri karşılamaktan, tüm WordPress hook’larını ve filtrelerini kaydetmekten ve uygulamanın akışını yönetmekten sorumludur. Basit eklentilerde Controller tüm mantığı ve veri erişimini doğrudan üstlenebilir. Daha karmaşık uygulamalarda ise rolü bir orkestratöre dönüşür: iş mantığı için bir Service veya veri için bir Model çağırır, ardından sonuçları render edilmek üzere bir View katmanına iletir.
View (Sunum katmanı)
View, HTML çıktısı üretmek için kullanılan isteğe bağlı bir katmandır. Controller’dan veriyi alır ve render eder. Bir View minimum düzeyde PHP mantığı içermeli, yalnızca kendisine verilen veriyi göstermeye odaklanmalıdır.
Model (Veri katmanı)
Model’in tek sorumluluğu veritabanıyla doğrudan etkileşimdir. Bir Model sınıfı içinde WordPress veritabanı nesnesine $this->db üzerinden erişebilirsiniz (ör. $this->db->get_results(...)). Bu katman isteğe bağlıdır; eklentiniz veritabanıyla etkileşime girmiyorsa ona ihtiyacınız yoktur.
Service (Mantık katmanı)
Service katmanı, eklentinizin temel iş mantığı için isteğe bağlı ancak önerilen yerdir. Mantık bir Controller için fazla karmaşık hale geldiğinde onu bir Service’e taşımalısınız. Bu sayede Controller’lar yalın kalır ve istekleri karşılamaya odaklanır.
Örnek eklenti
Polylang RestAPI Helper
polylang-restapi-helper eklentisi, ATA framework’ünün kusursuz ve odaklı bir örneğidir.
WordPress eklentinizi ATA MVC ile nasıl yapılandırırsınız
Dokümantasyon
Eklentinizde ATA’yı kullanmaya nasıl başlarsınız, Hızlı ve kolay
Eklenti yaşam döngüsü & ana Controller
Her ATA eklentisi merkezi, kök bir Controller tarafından yönetilir. Bu ana controller tüm eklenti işlevlerinin giriş noktasıdır ve eklentinin yaşam döngüsünü yönetmekten sorumludur.
1. Ana eklenti dosyası (your-plugin-name.php) Bu dosya oldukça sadedir. Tek görevi temel sabitleri tanımlamak, ATA framework’ünü yüklemek ve ana controller’ınızı örneklemektir.
// in your-plugin-name.php
namespace YourPluginNamespace;
// ... define constants ...
// Load the framework and all its dependencies
require_once PLUGIN_PATH . '/inc/main.php';
// Instantiate the one and only root controller
$my_plugin = new MainController();
// Hook into WordPress's activation/deactivation events
register_activation_hook(PLUGIN_FILE, [$my_plugin, 'activate']);
register_deactivation_hook(PLUGIN_FILE, [$my_plugin, 'deactivate']);
2. Ana Controller (app/controllers/main-controller.php) Bu controller etkinleştirme/devre dışı bırakma mantığını içerir ve en önemlisi diğer tüm controller’ları yükler. Diğer eklentilerin etkin olup olmamasına göre özellikleri koşullu olarak yükleyebileceğiniz yer burasıdır; böylece bellekten tasarruf eder ve hataların önüne geçersiniz.
// in app/controllers/main-controller.php
namespace YourPluginNamespace;
class MainController extends Controller
{
public function __construct()
{
parent::__construct();
$this->load_features();
}
// Load other controllers for specific features
private function load_features()
{
// Always load the admin UI and asset controllers
(new AdminUiController())->main();
(new AssetsController())->main();
// **Conditionally load features**
// Only load the WooCommerce compatibility layer if WooCommerce is active
if (is_plugin_active('woocommerce/woocommerce.php')) {
(new WooCommerceController())->main();
}
}
// Logic for when the plugin is activated (e.g., create DB tables)
public function activate()
{
// ... your activation code ...
}
// Logic for when the plugin is deactivated (e.g., remove DB tables)
public function deactivate()
{
// ... your deactivation code ...
}
}
WordPress yönetim paneline sayfa veya sekme ekleme
ATA, birden fazla sekmeli yönetim sayfalarını kolayca oluşturmak için akıcı (fluent) bir arayüz sunar. Bu, bir controller üzerinden yönetilir.
// in app/controllers/admin-ui-controller.php
namespace YourPluginNamespace;
class AdminUiController extends Controller
{
public function main()
{
$this->add_wp_admin_pages();
}
private function add_wp_admin_pages()
{
// Create a top-level page titled "My Plugin"
$this->admin_page('My Plugin')
// Only users who can 'manage_options' can see it
->permission('manage_options')
// Add a "Dashboard" tab (calls the 'dashboard_page' method)
->add_tab('Dashboard', 'dashboard_page')
// Add a "Settings" tab (calls the 'settings_page' method)
->add_tab('Settings', 'settings_page')
// Register the page and all its tabs
->register();
}
// This method is called when the 'Dashboard' tab is active
public function dashboard_page()
{
$this->view = 'dashboard'; // Renders views/dashboard-view.php
}
// This method is called when the 'Settings' tab is active
public function settings_page()
{
$this->view = 'settings'; // Renders views/settings-view.php
}
}
Bir WordPress hook’una bağlanma (Action)
ATA, action hook’larını kaydetmek için temel controller’ında kullanışlı bir on() yardımcı metodu sunar. Tüm hook’ları kaydetmek için ideal yer, controller’ınızın constructor’ı veya bir main() metodudur.
// in app/controllers/footer-message-controller.php
namespace YourPluginNamespace;
class FooterMessageController extends Controller
{
public function main()
{
// Hook into 'wp_footer' to call the 'add_message' method
$this->on('wp_footer', 'add_message');
}
public function add_message()
{
echo "";
}
}
WordPress filtrelerini kullanma
Action’lara benzer şekilde, veriyi değiştirmek için filter() yardımcı metodunu kullanabilirsiniz.
// in app/controllers/content-controller.php
namespace YourPluginNamespace;
class ContentController extends Controller
{
public function main()
{
// Hook into 'the_content' to modify post content
$this->filter('the_content', 'add_author_bio');
}
public function add_author_bio($content)
{
if (is_single() && in_the_loop() && is_main_query()) {
$author_bio = '';
return $content . $author_bio;
}
return $content;
}
}
WordPress REST API endpoint’i ekleme
1. Adım: Route’u kaydedin, app/routes/main-routes.php içinde. Bu, WordPress’e URL’nizin var olduğunu ve onu hangi metodun karşılayacağını bildirir.
// in app/routes/main-routes.php
namespace YourPluginNamespace;
$ata_router->api_version('my-plugin/v1');
$ata_router->api_method('GET')->api('/products')->call('ProductsApi::get_all_products');
2. Adım: Bir API sınıfı oluşturun, endpoint mantığını barındırması için app/apis/ içinde.
// in app/apis/products-api.php
namespace YourPluginNamespace;
class ProductsApi extends Api {
public function get_all_products() {
// ... logic to get products ...
return $this->send_success('Products retrieved.', ['products' => '...']);
}
}
Yönlendirme nasıl çalışır?
Route dosyası (app/routes/main-routes.php) güçlü ama isteğe bağlı bir özelliktir. Tek görevi bir santral gibi davranarak WordPress’e belirli özel URL’leri nasıl ele alacağını söylemektir. Eklentiniz özel URL’lere veya bir REST API’ye ihtiyaç duymuyorsa onu kullanmanıza gerek yoktur.
- REST API’ler için:
api()metodunu kullanın. Bu,/wp-json/altında yeni bir endpoint kaydeder.// Registers: example.com/wp-json/my-plugin/v1/orders $ata_router->api_version('my-plugin/v1'); $ata_router->api('/orders')->call('MyOrdersApi::get_orders'); - Özel frontend URL’leri için:
page()metodunu kullanın. Bu, bir WordPress sayfası (Page) oluşturmaya gerek kalmadan sanal bir sayfa oluşturur.// Registers: example.com/my-custom-url/ $ata_router->page('/my-custom-url')->call('MyPageController::show_page');
İsteğe bağlı çekirdek dizinler ne işe yarar?
app/views
Bu dizin HTML şablonlarınızı barındırır. Yalnızca eklentiniz yönetim ayarları sayfası veya özel bir frontend sayfası gibi bir kullanıcı arayüzü üretiyorsa gereklidir. Yalnızca arka plan işlevleri veya bir REST API sunan eklentilerde büyük olasılıkla bir views dizini bulunmaz.
models/structures (DTO’lar)
Bu dizin Veri Transfer Nesneleri (DTO’lar) içindir. DTO, aktarılan verinin şeklini tanımlamak için kullanılan basit bir sınıftır. Bu dizin isteğe bağlıdır ve birçok eklenti için gerekli olmayabilir. En çok, özellikle harici bir API ile iletişim kurarken katı bir veri yapısını zorunlu kılmanız gerektiğinde işe yarar.
Sıradaki başarı hikâyesi sizinki olabilir.
Sorularınız mı var? Doğru adımı atmanız için buradayız.