Edit: On January 14, 2019, the Good and Bad Practices section was added to show both correct and incorrect code examples.
Starting in WordPress 5.1, if register_rest_route()
is not called on the rest_api_init
action hook, a “doing it wrong” notice will be triggered. This notice is being added in an effort to encourage best practices when registering REST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think “phone app” or “website”) can communicate with the data store (think “database” or “file system”) https://developer.wordpress.org/rest-api/. endpoints.
First, let’s look at what happens when WordPress loads to set up the REST API and explore a few reasons why this pattern is beneficial.
REST API Bootstrap Process
WordPress does its best to ensure that the REST API is only loaded when a REST request is being performed. To do this, the rest_api_loaded()
function is run on the parse_request
action and checks for a value in the rest_route
query argument. This argument is populated with a value when the Rewrite API An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. matches a WordPress REST API URL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org. When a value is present, the rest_get_server()
function is called to instantiate the WP_REST_Server
class, store it for use across WordPress, and to run the rest_api_init
action hook.
Performance
When register_rest_route()
is called, it invokes rest_get_server()
to retrieve the global WP_REST_Server
instance created in the bootstrap process. But, if the instance has not been set up yet, it is instantiated then and the rest_api_init
action hook is run. This means that every function added to the rest_api_init
hook will fire at that time. This could result in a large performance hit.
For example, say register_rest_route()
is called on the init
action, or, just called in a theme’s functions.php
file. The REST API server would be set up for every WordPress request, even those that are not actually aimed at the REST API.
Missing Endpoints
If register_rest_route()
is called too early, it’s also possible that endpoints will go missing and never be registered. This happens when other plugins are not given the chance to register their rest_api_init
hooks In WordPress theme and development, hooks are functions that can be applied to an action or a Filter in WordPress. Actions are functions performed when a certain event occurs in WordPress. Filters allow you to modify certain functions. Arguments used to hook both filters and actions look the same..
For example, say register_rest_route()
is called directly in an mu-plugin
file. This will cause the REST API to be set up before regular plugins are run, so their rest_api_init
hooks will not be registered.
Good and Bad Practices
Let’s look at a few code examples and detail why they are good or bad.
Bad Practice
register_rest_route(
'hello-world/v1',
'/phrase',
array(
'method' => 'GET',
'callback' => 'myplugin_get_endpoint_phrase',
)
);
In this example, register_rest_route()
is called directly in a file without being attached to an action hook. This means the function will be called as soon as the file is loaded by WordPress. All of the potential issues detailed above are possible, and a _doing_it_wrong()
notice will be triggered.
Good Practice
function myplugin_register_endpoints() {
register_rest_route(
'hello-world/v1',
'/phrase',
array(
'method' => 'GET',
'callback' => 'myplugin_get_endpoint_phrase',
)
);
}
add_action( 'rest_api_init', `myplugin_register_endpoints` );
In this example, register_rest_route()
is correctly placed inside of a function that is added to the rest_api_init
action hook. It will only execute when the rest_api_init
action hook is executed. The potential issues detailed above are avoided, and no _doing_it_wrong()
notice is triggered.
Changes Required
Plugins and Themes
All plugins and themes should double check that their REST API endpoints are being registered correctly using the rest_api_init
action hook. This best practice is also mentioned in the Routes and Endpoints section of the REST API Handbook. If this was a resource used when developing, chances are you won’t have to change anything!
Unit Tests
Because some unit tests require custom endpoints to exist, it is not uncommon for a test method to call register_rest_route()
directly. If a test method calls the function before rest_api_init
, a previously passing test method may now fail. This can be fixed in two ways.
The first way is to use rest_get_server()
to create the WP_Rest_Server
instance for your tests. Since rest_api_init
is run within that function, this will prevent the notice. This approach can be seen in the Tests_REST_Server
class. The wp_rest_server_class
filter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. still allows you to replace the default WP_Rest_Server
class with your own for testing purposes with this method.
The second way is to call do_action( 'rest_api_init' );
directly in your test method or setUp()
method. This method is for scenarios where complete control is needed over the REST server setup process. This can approach can be seen in the Tests_REST_API
class.
You can read more information about this change in the ticket on Trac.
#5-1, #dev-notes, #rest-api
You must be logged in to post a comment.