Stars: 340
Forks: 20
Pull Requests: 8
Issues: 33
Watchers: 14
Last Updated: 2023-09-05 19:56:17
Routing system for WordPress
License: MIT License
Languages: PHP
Cortex is routing system for WordPress based on FastRoute
First of all ensure Composer autoload is loaded.
After that "boot" Cortex:
Brain\Cortex::boot();
This can be done as soon as you can, no need to wrap in a hook.
It will not work after 'do_parse_request'
has been fired.
To add routes, it is possible to use 'cortex.routes'
hook, that passes an instance of
RouteCollectionInterface
:
use Brain\Cortex\Route\RouteCollectionInterface;
use Brain\Cortex\Route\QueryRoute;
add_action('cortex.routes', function(RouteCollectionInterface $routes) {
$routes->addRoute(new QueryRoute(
'{type:[a-z]+}/latest',
function(array $matches) {
return [
'post_type' => $matches['type'],
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'ASC'
];
}
));
});
The route pattern (1st argument) syntax is inherited from FastRoute.
The callback passed as second argument receives the array of matches ($routeInfo[2]
in FastRoute)
and has to return an array of arguments for WP_Query
.
QueryRoute
argumentsQueryRoute
constructor accepts as 3rd argument an array of options for
route configuration.
One of them is "template" to force WordPress use a template when the route matches:
add_action('cortex.routes', function(RouteCollectionInterface $routes) {
$routes->addRoute(new QueryRoute(
'post/latest',
function(array $matches) {
return [
'orderby' => 'date',
'order' => 'DESC'
];
},
['template' => 'latest.php']
));
});
As shown above,template
argument can be a relative path to theme (or child theme) folder.
To use a template that resides outside theme folder, template
argument need to be full absolute path
to the template file to use.
There are other arguments, among them:
POST
or GET
)https
or http
)A route group is a way to share common settings among routes.
Before assign groups to routes, we need to add groups.
That can be done using 'cortex.groups'
hook, that pass an instance of GroupCollectionInterface
:
use Brain\Cortex\Route\RouteCollectionInterface;
use Brain\Cortex\Group\GroupCollectionInterface;
use Brain\Cortex\Route\QueryRoute;
use Brain\Cortex\Group\Group;
add_action('cortex.groups', function(GroupCollectionInterface $groups) {
$groups->addGroup(new Group([
'id' => 'archive-group',
'template' => 'archive.php',
'before' => function() {
// do something before route callback
}
]));
});
add_action('cortex.routes', function(RouteCollectionInterface $routes) {
$routes->addRoute(new QueryRoute(
'^post/latest$',
function(array $matches) {
return [
'orderby' => 'date',
'order' => 'DESC'
];
},
['group' => 'archive-group']
));
$routes->addRoute(new QueryRoute(
'post/oldest',
function(array $matches) {
return [
'orderby' => 'date',
'order' => 'ASC'
];
},
['group' => 'archive-group']
));
});
A group is instantiated passing an array of values to its constructor.
The value "id" is required. All other values are optional, and can be used to set
any route property (array items in 3rd param of QueryRoute
constructor).
To use properties from a group in a route, the group id has to be set in the 'group'
route property.
'group'
property also accepts an array of group ids, to assign properties
from multiple groups.
QueryRoute
is just one of the routes shipped with Cortex.
There are others and it is possible to write custom routes implementing Brain\Cortex\Route\RouteInterface
.
Another implementation included in Cortex is RedirectRoute
. As the name suggests,
it is used to redirect urls to other urls.
use Brain\Cortex\Route\RouteCollectionInterface;
use Brain\Cortex\Route\RedirectRoute;
add_action('cortex.routes', function(RouteCollectionInterface $routes) {
$routes->addRoute(new RedirectRoute(
'old/url/{postname}',
function(array $matches) {
return 'new/url/' . $matches['postname'];
}
));
});
RedirectRoute
accepts an array of options as well.
Using option is possible to configure HTTP status code to use ('redirect_status'
option, default 302)
and if allows or not redirect to external urls ('redirect_external'
option, default false).
Via Composer, require brain/cortex
in version ~1.0.0
.
composer require brain/cortex:~1.0.0
You may need to lessen your project's minimum stability requirements.
composer config minimum-stability dev
MIT