Overview
Architecture and design philosophy of WPZylos Routing.
Philosophy
WPZylos Routing provides a unified, Laravel-like routing experience for WordPress plugins. It abstracts the complexity of WordPress's routing mechanisms while respecting WordPress conventions.
Architecture
+-------------------------------------------------------------+
— RoutingServiceProvider —
+-------------------------------------------------------------—
— —
— +-------------+ +-------------+ +---------------------+ —
— — Router — — RestRouter — — AjaxRouter — —
— — (Frontend) — — (REST API) — — (WordPress AJAX) — —
— +-------------+ +-------------+ +---------------------+ —
— — — — —
— ? ? ? —
— +-------------+ +-------------+ +---------------------+ —
— — Dispatcher — —RestDispatcher— — wp_ajax_* hooks — —
— +-------------+ +-------------+ +---------------------+ —
— — — —
— ? ? —
— template_redirect rest_api_init —
— —
+-------------------------------------------------------------+
Route Types
Frontend Routes
Custom URL patterns that integrate with WordPress rewrite rules. Dispatched on template_redirect hook.
REST API Routes
WordPress REST API endpoints registered via register_rest_route(). Fully integrated with WordPress's REST infrastructure.
AJAX Routes
Traditional WordPress AJAX endpoints using wp_ajax_* hooks. Automatic nonce verification and JSON responses.
WordPress Integration
| Feature | WordPress Hook/Function |
|---|---|
| Frontend | template_redirect + add_rewrite_rule() |
| REST API | rest_api_init + register_rest_route() |
| AJAX | init + add_action('wp_ajax_*') |
| Nonce | wp_verify_nonce(), wp_create_nonce() |
| Permissions | current_user_can() |
Context Awareness
The router respects WordPress context and skips routing for:
- Admin pages (
is_admin()) - Cron requests (
wp_doing_cron()) - AJAX requests (
wp_doing_ajax()) - REST API requests (
REST_REQUEST) - XML-RPC requests (
XMLRPC_REQUEST)
Middleware Pipeline
All routers support PSR-15 style middleware:
$router->get('/admin', [Controller::class, 'index'])
->middleware([AuthMiddleware::class, LogMiddleware::class]);
Middleware runs in order, with each calling $next($request) to continue the chain.