Can I users?
WordPress flow
WordPress packs an amazing amount of functions and APIs and I’ve tapped into two (filters and the routing one) to make things go the way I want.
The purpose of the experiment is to find if this alternative routing solution can make sense and be a feasible and convenient way to build some projects.
To have such a result, as a first step, I want to have the possibility to continue normal WordPress execution should the requested path not be matched by any defined route.
It takes little time to verify that
/**
* Plugin Name: theAverageDev Routes
* Plugin URI: http://theAverageDev.com
* Description: Routing for WordPress
* Version: 1.0
* Author: theAverageDev
* Author URI: http://theAverageDev.com
* License: GPL 2.0
*/
require 'vendor/autoload_52.php';
/**
* Support methods
*/
function _json_post( $request, $response ) {
$post_id = $request->param( 'id' );
$post = get_post( $post_id );
if ( empty( $post ) ) {
echo json_encode( [ 'Error' => 'Not a valid post ID' ] );
} else {
echo( json_encode( $post ) );
}
}
/**
* Routes
*/
function route_posts() {
respond( 'GET', '/[i:id]/json', '_json_post' );
}
function _dispatch() {
$found = dispatch( null, null, null, true );
if ( $found ) {
die($found);
}
}
/**
* Parse request
*/
add_filter( 'do_parse_request', 'tad_routes_do_parse_request', 1, 3 );
function tad_routes_do_parse_request( $continue, WP $wp, $extra_query_vars ) {
with( '/posts', 'route_posts' );
_dispatch();
return $continue;
}
Hitting the /posts/[id]/route
will yield the json version of the post while hitting any other route will go on with the usual WordPress flow; WordPress is not lost to me.
Users
I’d like to know if, at this point of the WordPress flow, I will be able to have information about the current user; this is a fundamental feature for any routing to make sense.
The code below tests for such a feature at the /who-am-i
route:
/**
* Plugin Name: theAverageDev Routes
* Plugin URI: http://theAverageDev.com
* Description: Routing for WordPress
* Version: 1.0
* Author: theAverageDev
* Author URI: http://theAverageDev.com
* License: GPL 2.0
*/
require 'vendor/autoload_52.php';
/**
* Support methods
*/
function _json_post( $request, $response ) {
$post_id = $request->param( 'id' );
$post = get_post( $post_id );
if ( empty( $post ) ) {
echo json_encode( [ 'Error' => 'Not a valid post ID' ] );
} else {
echo( json_encode( $post ) );
}
}
function _dispatch() {
$found = dispatch( null, null, null, true );
if ( $found ) {
die( $found );
}
}
/**
* Routes
*/
function route_posts() {
respond( 'GET', '/[i:id]/json', '_json_post' );
}
function route_who_am_i() {
$user = wp_get_current_user();
echo $user->ID > 0 ? sprintf( 'Hi %s', $user->display_name ) : 'You are not logged in';
}
/**
* Parse request
*/
add_filter( 'do_parse_request', 'tad_routes_do_parse_request', 1, 3 );
function tad_routes_do_parse_request( $continue, WP $wp, $extra_query_vars ) {
with( '/posts', 'route_posts' );
respond( '/who-am-i', 'route_who_am_i' );
_dispatch();
return $continue;
}
Hitting the route as a logged in user will show a message with the user name while hitting it as a non-logged in user will show this message This is another good thing to have to use WordPress as a back-end tool.
Next
The code used in this post in on GitHub and the next steps will be to explore the limits of this solution; I know I’m renouncing the WordPress query and routing system but do not know the exact limits of this choice and am working to know them.