Routing to callback functions in WordPress – 01

I like the way routes to endpoints can be set in Laravel: it’s clear and logic and allows doing clean things like RESTful URLs in a way WordPress will sometimes not offer.
I’ve recently run into the need to add archive pages to the menu and got stuck with either a workaround, like adding an empty page and applying an archive template to it, or using some plugin to do so.

Can I route?

I’d like to be able to write an URL like /posts to get the posts archive and something like /posts/some-post-title or /posts/21to get a specific post.
While WordPress native Rewrite API is the way to go it seems a little daunting at first and led me to more OOP approaches and solutions like WP-Router.

I can route somewhat

After installing WP-Router and setting up a plugin to use it in its main class I’ve hooked into the right action

class Main
    public function __construct()
        add_action('wp_router_generate_routes', array(
            get_class() ,

to map the route to a function callback and be able to control the output with it

    public static function addRoutes(\WP_Router $router)
        $router->add_route('hello-route', array(
            'path' => '^hello/(\w*?)$',
            'query_vars' => array(
                'name' => 1,
            ) ,
            'page_callback' => function($name){
                echo "Hello $name";
            'page_arguments' => array(
            'template' => false

the function is outputting to the page and using that route parameter to show an output, once the plugin is activated and I enter the /hello/world URL the message, and that alone, is shown on the page

Hello world output
Hello world output

please note that any theme layout and template is ignored and not shown on the page; the only output is the one that the callback function, a closure here, is producing.
In a Laravel-like fashion it allows using functions to show content on the page. The interface the plugin offers, though, is not that easy to grasp.


I like WP-Router so far and would like to create an adapter/wrapper class around it to model its interface on the one used by Laravel like

Route::get('/landing', function(){
        echo 'Hello world';

That’s possible using a function like

$router->add_route('root-route', array(
    'path' => 'landing',
    'page_callback' => function(){
        echo "Hello world";
    'template' => false

but that sure is more code than Laravel’s solution.

I appreciate your input