From d16e6740d5b86c9cf97fa10cf32bca5d22f286b8 Mon Sep 17 00:00:00 2001 From: desrosj Date: Thu, 13 Dec 2018 22:25:49 +0000 Subject: [PATCH] REST API: Introduce the `rest_preload_api_request()` function. This function helps perform multiple REST API requests, for the purpose of preloading data into a page. Props pento. Merges [43763] to trunk. See #45110. Built from https://develop.svn.wordpress.org/trunk@44123 git-svn-id: http://core.svn.wordpress.org/trunk@43953 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/rest-api.php | 53 ++++++++++++++++++++++++++++++++++++++++ wp-includes/version.php | 2 +- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/wp-includes/rest-api.php b/wp-includes/rest-api.php index 2c0e8f7e18..5cd7ef8774 100644 --- a/wp-includes/rest-api.php +++ b/wp-includes/rest-api.php @@ -1311,3 +1311,56 @@ function rest_sanitize_value_from_schema( $value, $args ) { return $value; } + +/** + * Append result of internal request to REST API for purpose of preloading data to be attached to a page. + * Expected to be called in the context of `array_reduce`. + * + * @since 5.0.0 + * + * @param array $memo Reduce accumulator. + * @param string $path REST API path to preload. + * @return array Modified reduce accumulator. + */ +function rest_preload_api_request( $memo, $path ) { + // array_reduce() doesn't support passing an array in PHP 5.2, so we need to make sure we start with one. + if ( ! is_array( $memo ) ) { + $memo = array(); + } + + if ( empty( $path ) ) { + return $memo; + } + + $path_parts = parse_url( $path ); + if ( false === $path_parts ) { + return $memo; + } + + $request = new WP_REST_Request( 'GET', $path_parts['path'] ); + if ( ! empty( $path_parts['query'] ) ) { + parse_str( $path_parts['query'], $query_params ); + $request->set_query_params( $query_params ); + } + + $response = rest_do_request( $request ); + if ( 200 === $response->status ) { + $server = rest_get_server(); + $data = (array) $response->get_data(); + if ( method_exists( $server, 'get_compact_response_links' ) ) { + $links = call_user_func( array( $server, 'get_compact_response_links' ), $response ); + } else { + $links = call_user_func( array( $server, 'get_response_links' ), $response ); + } + if ( ! empty( $links ) ) { + $data['_links'] = $links; + } + + $memo[ $path ] = array( + 'body' => $data, + 'headers' => $response->headers, + ); + } + + return $memo; +} diff --git a/wp-includes/version.php b/wp-includes/version.php index 5f0cd56ce3..a97f8281d3 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.1-alpha-44122'; +$wp_version = '5.1-alpha-44123'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.