Make WordPress Core

Changeset 43763


Ignore:
Timestamp:
10/19/2018 08:56:58 AM (6 years ago)
Author:
pento
Message:

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.

See #45110.

Location:
branches/5.0
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/5.0/src/wp-includes/rest-api.php

    r43739 r43763  
    13121312    return $value;
    13131313}
     1314
     1315/**
     1316 * Append result of internal request to REST API for purpose of preloading data to be attached to a page.
     1317 * Expected to be called in the context of `array_reduce`.
     1318 *
     1319 * @since 5.0.0
     1320 *
     1321 * @param  array  $memo Reduce accumulator.
     1322 * @param  string $path REST API path to preload.
     1323 * @return array        Modified reduce accumulator.
     1324 */
     1325function rest_preload_api_request( $memo, $path ) {
     1326    // array_reduce() doesn't support passing an array in PHP 5.2, so we need to make sure we start with one.
     1327    if ( ! is_array( $memo ) ) {
     1328        $memo = array();
     1329    }
     1330
     1331    if ( empty( $path ) ) {
     1332        return $memo;
     1333    }
     1334
     1335    $path_parts = parse_url( $path );
     1336    if ( false === $path_parts ) {
     1337        return $memo;
     1338    }
     1339
     1340    $request = new WP_REST_Request( 'GET', $path_parts['path'] );
     1341    if ( ! empty( $path_parts['query'] ) ) {
     1342        parse_str( $path_parts['query'], $query_params );
     1343        $request->set_query_params( $query_params );
     1344    }
     1345
     1346    $response = rest_do_request( $request );
     1347    if ( 200 === $response->status ) {
     1348        $server = rest_get_server();
     1349        $data   = (array) $response->get_data();
     1350        if ( method_exists( $server, 'get_compact_response_links' ) ) {
     1351            $links = call_user_func( array( $server, 'get_compact_response_links' ), $response );
     1352        } else {
     1353            $links = call_user_func( array( $server, 'get_response_links' ), $response );
     1354        }
     1355        if ( ! empty( $links ) ) {
     1356            $data['_links'] = $links;
     1357        }
     1358
     1359        $memo[ $path ] = array(
     1360            'body'    => $data,
     1361            'headers' => $response->headers,
     1362        );
     1363    }
     1364
     1365    return $memo;
     1366}
  • branches/5.0/tests/phpunit/tests/rest-api.php

    r41744 r43763  
    594594        $this->assertEquals( $routes['/test-ns/test'][0]['methods'], array( 'GET' => true ) );
    595595    }
     596
     597    /**
     598     * Ensure rest_preload_api_request() works without notices in PHP 5.2.
     599     *
     600     * The array_reduce() function only accepts mixed variables starting with PHP 5.3.
     601     */
     602    function test_rest_preload_api_request_no_notices_php_52() {
     603        $this->assertTrue( is_array( rest_preload_api_request( 0, '/' ) ) );
     604    }
    596605}
Note: See TracChangeset for help on using the changeset viewer.