Open Source · Ata
Прокачайте свой плагин WordPress.
Со структурой MVC-S.
ATA помогает разработчикам плагинов WordPress сохранять растущую кодовую базу упорядоченной и удобной в поддержке благодаря паттерну проектирования MVC.
Для разработчиков плагинов WordPress
У всего, своя папка.
ATA даёт каждому плагину одинаковую предсказуемую структуру, поэтому растущая кодовая база остаётся упорядоченной и удобной в поддержке.
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.
Структура по умолчанию
ATA предлагает готовую структуру каталогов, которая логично разделяет части вашего плагина.
Прежде всего, ООП
Фреймворк поощряет писать код в классах, а не в процедурных функциях,, это улучшает переиспользуемость и организацию кода.
Чёткое разделение ответственности
Он реализует вариацию паттерна MVC, чтобы логика, данные и представление оставались в отдельных слоях.
Простая маршрутизация
В ATA есть встроенный роутер, с которым регистрация собственных эндпоинтов REST API или URL становится простой и декларативной.
Ключевые отличия
Что такое MVC-S?
ATA продвигает вариант паттерна Model-View-Controller (MVC), который мы называем MVC-S (Model-View-Controller-Services).
Controller (центральный механизм)
Controller, ядро работы вашего плагина. Он обрабатывает входящие запросы, регистрирует все хуки и фильтры WordPress и управляет потоком приложения. В простых плагинах Controller может сам выполнять всю логику и доступ к данным. В более сложных приложениях его роль меняется, он становится оркестратором: вызывает Service для бизнес-логики или Model для данных, а затем передаёт результат во View для отрисовки.
View (слой представления)
View, это необязательный слой для генерации HTML. Он получает данные от Controller и отрисовывает их. Во View должно быть минимум PHP-логики, только отображение переданных данных.
Model (слой данных)
Единственная задача Model, прямое взаимодействие с базой данных. Внутри класса Model объект базы данных WordPress доступен через $this->db (например, $this->db->get_results(...)). Этот слой необязателен: если плагин не работает с базой данных, он вам не нужен.
Service (слой логики)
Слой Service, это необязательное, но рекомендуемое место для основной бизнес-логики плагина. Когда логика становится слишком сложной для Controller, вынесите её в Service. Так контроллеры остаются тонкими и сосредоточенными на обработке запросов.
Пример плагина
Polylang RestAPI Helper
Плагин polylang-restapi-helper идеальный компактный пример фреймворка ATA.
Как перевести ваш плагин WordPress на ATA MVC
Документация
Как начать использовать ATA в своём плагине, быстро и просто
Жизненный цикл плагина и главный контроллер
Каждым плагином ATA управляет центральный, корневой Controller. Этот главный контроллер, точка входа для всей функциональности плагина, он управляет его жизненным циклом.
1. Главный файл плагина (your-plugin-name.php) Этот файл предельно минимален. Его задачи, определить основные константы, загрузить фреймворк ATA и создать экземпляр главного контроллера.
// 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. Главный контроллер (app/controllers/main-controller.php) Этот контроллер содержит логику активации и деактивации и, что важнее всего, загружает все остальные контроллеры. Здесь можно подключать функции в зависимости от того, активны ли другие плагины,, это экономит память и предотвращает ошибки.
// 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
ATA предоставляет fluent-интерфейс, чтобы легко создавать админ-страницы с несколькими вкладками. Управляется это из контроллера.
// 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
}
}
Подключение к хуку WordPress (Action)
В базовом контроллере ATA есть удобный хелпер on() для регистрации action-хуков. Лучшее место для регистрации всех хуков, конструктор или метод main() вашего контроллера.
// 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
Как и в случае с actions, для изменения данных можно использовать хелпер filter().
// 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
Шаг 1: зарегистрируйте маршрут в app/routes/main-routes.php. Так WordPress узнает, что ваш URL существует и какой метод должен его обрабатывать.
// 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: создайте API-класс в app/apis/ с логикой эндпоинта.
// 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' => '...']);
}
}
Как работает маршрутизация?
Файл маршрутов (app/routes/main-routes.php), мощная, но необязательная возможность. Его единственная задача, работать коммутатором, подсказывая WordPress, как обрабатывать определённые собственные URL. Если плагину не нужны собственные URL или REST API, он вам не понадобится.
- Для REST API: используйте метод
api(). Он регистрирует новый эндпоинт в/wp-json/.// Registers: example.com/wp-json/my-plugin/v1/orders $ata_router->api_version('my-plugin/v1'); $ata_router->api('/orders')->call('MyOrdersApi::get_orders'); - Для собственных фронтенд-URL: используйте метод
page(). Он создаёт виртуальную страницу без записи типа «Страница» в WordPress.// Registers: example.com/my-custom-url/ $ata_router->page('/my-custom-url')->call('MyPageController::show_page');
Зачем нужны необязательные базовые каталоги?
app/views
В этом каталоге хранятся HTML-шаблоны. Он нужен только если плагин создаёт пользовательский интерфейс, например страницу настроек в админке или собственную страницу на фронтенде. У плагинов, которые работают только в фоне или предоставляют REST API, каталога views скорее всего не будет.
models/structures (DTO)
Этот каталог предназначен для Data Transfer Objects (DTO). DTO, простой класс, описывающий форму передаваемых данных. Каталог необязателен и многим плагинам не понадобится. Он особенно полезен, когда нужно обеспечить строгую структуру данных, особенно при работе с внешним API.
Ваша история успеха может стать следующей.
Есть вопросы? Мы поможем принять верное решение.