The WordPress Rest Api has many build in endpoints for you to access. But sometimes you may need something a little more specific, or need access to a resource that is not supported out of the box. In these cases you can create your own custom endpoint. In this example we create a (pretty useless) endpoint for fetching post meta values.
With the snippet above we add an action to the rest_api_init hook, and register a new callback function called mytheme_get_meta_value.
With the mytheme_get_meta_value function we make a call to the register_rest_route function and pass three parameters:
- $namespace: A unique namespace that groups your custom endpoints. This will be the first URL segment after core prefix.
- $route: The actual route. Usually a resource name with optional parameters.
- $args: An array of arguments.
For the $route parameter we pass a string including two parameter expressions like (?P[\d]+) This tells WordPress that we are expecting a parameter (?P) by the name of "post" with a value that must follow the regular expression of [\d]+ meaning an integer/id. Second we expect a parameter by the name of "key" that must follow the regular expression of [a-zA-Z0-9_-]+ meaning a string of letters, numbers. underscores and dashes.
Note: You don't have to use url parameters in this way. You could also pass Get parameters (?posts=9&key=some_value) or Post parameters.
For the arguments parameter we pass an array with two key/value pairs:
- Methods: The request method. E.g. GET, POST or a WP_REST_Server constant like WP_REST_Server::READABLE = 'GET', WP_REST_Server::EDITABLE = 'POST, PUT, PATCH', WP_REST_Server::DELETABLE = 'DELETE', WP_REST_Server::ALLMETHODS = 'GET, POST, PUT, PATCH, DELETE'
- Callback: The callback function that will be called when the route is requested.
Note: You could also pass an array of arrays where each inner array has a different method and callback function. This is useful when you need a different callback function for Get and Post methods.
In the code above we passed mytheme_handle_get_meta_value as our route callback function. Lets create that function now.
In this callback function we first extract the post and key parameters from the passed in $request array. These values come from the Url parameters we set for the $route parameter in the register_rest_route function earlier.
Here we use the $.ajax function to make a GET request to '/wp-jsaon/mytheme/v1/meta/9/_thumbnail_id', where 9 is a post id and _thumbnail_id is the meta value we want to retrieve. On success we get the meta key from the returned data object to get our meta value and log it to the console. This meta key comes from the array we passed to rest_ensure_response earlier. If we get an error we use error.responseJSON.message to get the error message and log that to the console.
This is just a simple/basic example and we didn't handle things like securing the endpoint which I highly recommend you do when dealing with delicate data. You can read up on security and more in the Rest Api handbook under Adding custom endpoints.
Thanks for reading