WordPress 6.1 brings a number of key improvements to the 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/. to increase performance. These improvements decrease the number of database queries that are run on each REST API request.
Avoid unnecessarily preparing item links
Prior to WordPress 6.1, the prepare_links
method in the REST API was called in all controllers. If the _fields
parameter is passed to the REST API request, it might mean that the links field is not requested and would never be returned in the response. This is wasteful, as prepare_links
can contain database calls or other complex logic that would be run even if it never returned the response.
In 6.1 prepare_links
are only called if requested in the response, when links are requested in fields or the _embedded
parameter is passed. As part of this work, the taxonomy A taxonomy is a way to group things together. In WordPress, some common taxonomies are category, link, tag, or post format. https://codex.wordpress.org/Taxonomies#Default_Taxonomies. and post type controllers have now been updated to implement said prepare_links
method to bring them in line with other REST API controllers.
This is the code example of implementing this change in custom REST API controllers.
Before
$response = rest_ensure_response( $data );
$links = $this->prepare_links( $post );
$response->add_links( $links );
return $response;
After
$response = rest_ensure_response( $data );
if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
$links = $this->prepare_links( $post );
$response->add_links( $links );
}
return $response;
This logic conditionally calls prepare_links only if _links
or _embedded
is requested. This logic only applies when using the _fields
query parameter. When not using _fields
, links are included in the response as normal.
For more info see Trac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. ticket Created for both bug reports and feature development on the bug tracker.: #52992, #56019, #56020
Improvement to the Posts controller
When running profiling tools against the responses of REST API requests, it was discovered that post controllers request a lot of linked data to each post. For example, when returning a post in a REST API response, linked data such as author (user), featured image A featured image is the main image used on your blog archive page and is pulled when the post or page is shared on social media. The image can be used to display in widget areas on your site or in a summary list of posts., and parent post were all requested. As these linked items were not primed in caches, it could mean that for each post in the REST API response there would be 3 separate database queries: one for the user, one for the featured image, and another for the parent post.
In WordPress 6.1 all the caches are primed in a single database query and there are new helper functions to enable this:
update_post_author_caches
Takes an array of posts and primes users caches in a single query.
update_post_parent_caches
Takes an array of posts and primes post parents in a single query.
update_menu_item_cache
Takes an array of posts and primes post / terms link to menu items single query.
The existing function update_post_thumbnail_cache
was used to prime featured image caches. These functions are also being rolled out to other parts of the core Core is the set of software required to run WordPress. The Core Development Team builds WordPress. that can benefit from priming caches in a single place.
For more info see Trac tickets: #55592, #55593, #55620
Improvements to other controllers
The comments and user controllers have also been improved: User controller now primes user meta Meta is a term that refers to the inside workings of a group. For us, this is the team that works on internal WordPress sites like WordCamp Central and Make WordPress. in a single query and the comments controller now primes the linked post cache in a single query. Improvements were made to the post search controller to improve database performance along with the media controller.
For more info see Trac tickets: #55674, #56272, #55677, #55716
Props to @flixos90 and @milana_cap for peer review and @mxbclang and @webcommsat for proofreading.
#6-1, #core-restapi, #dev-notes, #dev-notes-6-1, #performance, #rest-api