Setting up some tests was a question of time more than difficulties and I’m now facing the “hard” part of the task at hand: adding pages to WordPress backend “Pages” screen.
Before committing to some lengthy testing and coding I’ve took a peek to both the code and the database effects of WP Router to understand what’s happening “under the hood”.
Beginning from the end
Upon installation a single post, of the wp_router_page
post type, will be created in the database and that will allow routes added at wp_router_generate_routes
time to generate a page like the one below for the sample route in the Twenty Fourteen WordPress theme. Using the Rewrite Rules Inspector plugin I know the
^wp_router/(.*?)$
route is the first valid route answering that request. That’s the route created in the WP_Router_Sample_Class.php
file: it all makes sense.
The famous “Hello there” route
My objective is to create a page that, upon visiting, will redirect to a route. To test a possible approach I’ve added, in the WP_Router_Sample_Class.php
file itself, a new /hello
route accepting no parameters and simply displaying an “Hello there” message. Not a pinnacle of originality but I like to keep things simple.
class WP_Router_Sample {
public static function init() {
add_action('wp_router_generate_routes', array(get_class(), 'generate_routes'), 10, 1);
}
public static function generate_routes( WP_Router $router ) {
$router->add_route('wp-router-sample', array(
'path' => '^wp_router/(.*?)$',
'query_vars' => array(
'sample_argument' => 1,
),
'page_callback' => array(get_class(), 'sample_callback'),
'page_arguments' => array('sample_argument'),
'access_callback' => TRUE,
'title' => 'WP Router Sample Page',
));
// my `/hello` route
$router->add_route('hello-route', array(
'path' => '^hello/?$',
'page_callback' => array(get_class(), 'name_callback'),
'access_callback' => TRUE,
'title' => 'Hello world route',
));
}
public static function sample_callback( $argument ) {
echo '<p>Welcome to the WP Router sample page. You can find the code that generates this page in '.__FILE__.'</p>';
echo '<p>This page helpfully tells you the value of the <code>sample_argument</code> query variable: '.esc_html($argument).'</p>';
}
public static function name_callback(){
echo "Hello there";
}
}
Browsing to my local server http://route-pages.local/hello
will yield the expected result served by WP Router.
The not so famous “Hello there” page
Moving forward in my investigation I’ve created a page, via the WordPress admin backend, called “Hello world route” and let WordPress go on and default a lot of its values and here it is in the posts
table Visiting the page will show the page content so nothing strange is happening here. Using Sequel PRO I’ve modified the page post_name
value from hello-world-route
to hello
, saved, reloaded the page in the editing screen and visited it: here it is the “Hello there” message the route will return.
That might be it
So that might be the road to the plugin objective: I will programmatically create a page for some routes with the proper post_name
to have those pages behave like pages object, inheriting all the meta information pages can have, in the backend and like routes in the front-end.
Issue
Visiting the page poses no problems and will return the route callback function content, but trying to access some WordPress backend menus will either make the server run out of memory or the page be served blank. Since deactivating the WP Router plugin or restoring the original page post_name
fixes it I have to infer it’s my fault. I will go over that next and then move to further steps.