rest_filter_response_fields

The timeline below displays how wordpress function rest_filter_response_fields has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.5

/**
 * Filters the REST API response to include only an allow-listed set of response object fields.
 *
 * @since 4.8.0
 *
 * @param WP_REST_Response $response Current response being served.
 * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request  $request  The request that was used to make current response.
 * @return WP_REST_Response Response to be served, trimmed down to contain a subset of fields.
 */
function rest_filter_response_fields($response, $server, $request)
{
    if (!isset($request['_fields']) || $response->is_error()) {
        return $response;
    }
    $data = $response->get_data();
    $fields = wp_parse_list($request['_fields']);
    if (0 === count($fields)) {
        return $response;
    }
    // Trim off outside whitespace from the comma delimited list.
    $fields = array_map('trim', $fields);
    // Create nested array of accepted field hierarchy.
    $fields_as_keyed = array();
    foreach ($fields as $field) {
        $parts = explode('.', $field);
        $ref =& $fields_as_keyed;
        while (count($parts) > 1) {
            $next = array_shift($parts);
            if (isset($ref[$next]) && true === $ref[$next]) {
                // Skip any sub-properties if their parent prop is already marked for inclusion.
                break 2;
            }
            $ref[$next] = isset($ref[$next]) ? $ref[$next] : array();
            $ref =& $ref[$next];
        }
        $last = array_shift($parts);
        $ref[$last] = true;
    }
    if (wp_is_numeric_array($data)) {
        $new_data = array();
        foreach ($data as $item) {
            $new_data[] = _rest_array_intersect_key_recursive($item, $fields_as_keyed);
        }
    } else {
        $new_data = _rest_array_intersect_key_recursive($data, $fields_as_keyed);
    }
    $response->set_data($new_data);
    return $response;
}

WordPress Version: 5.6

/**
 * Filters the REST API response to include only a white-listed set of response object fields.
 *
 * @since 4.8.0
 *
 * @param WP_REST_Response $response Current response being served.
 * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request  $request  The request that was used to make current response.
 * @return WP_REST_Response Response to be served, trimmed down to contain a subset of fields.
 */
function rest_filter_response_fields($response, $server, $request)
{
    if (!isset($request['_fields']) || $response->is_error()) {
        return $response;
    }
    $data = $response->get_data();
    $fields = wp_parse_list($request['_fields']);
    if (0 === count($fields)) {
        return $response;
    }
    // Trim off outside whitespace from the comma delimited list.
    $fields = array_map('trim', $fields);
    // Create nested array of accepted field hierarchy.
    $fields_as_keyed = array();
    foreach ($fields as $field) {
        $parts = explode('.', $field);
        $ref =& $fields_as_keyed;
        while (count($parts) > 1) {
            $next = array_shift($parts);
            if (isset($ref[$next]) && true === $ref[$next]) {
                // Skip any sub-properties if their parent prop is already marked for inclusion.
                break 2;
            }
            $ref[$next] = isset($ref[$next]) ? $ref[$next] : array();
            $ref =& $ref[$next];
        }
        $last = array_shift($parts);
        $ref[$last] = true;
    }
    if (wp_is_numeric_array($data)) {
        $new_data = array();
        foreach ($data as $item) {
            $new_data[] = _rest_array_intersect_key_recursive($item, $fields_as_keyed);
        }
    } else {
        $new_data = _rest_array_intersect_key_recursive($data, $fields_as_keyed);
    }
    $response->set_data($new_data);
    return $response;
}

WordPress Version: 5.5

/**
 * Filter the API response to include only a white-listed set of response object fields.
 *
 * @since 4.8.0
 *
 * @param WP_REST_Response $response Current response being served.
 * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request  $request  The request that was used to make current response.
 * @return WP_REST_Response Response to be served, trimmed down to contain a subset of fields.
 */
function rest_filter_response_fields($response, $server, $request)
{
    if (!isset($request['_fields']) || $response->is_error()) {
        return $response;
    }
    $data = $response->get_data();
    $fields = wp_parse_list($request['_fields']);
    if (0 === count($fields)) {
        return $response;
    }
    // Trim off outside whitespace from the comma delimited list.
    $fields = array_map('trim', $fields);
    // Create nested array of accepted field hierarchy.
    $fields_as_keyed = array();
    foreach ($fields as $field) {
        $parts = explode('.', $field);
        $ref =& $fields_as_keyed;
        while (count($parts) > 1) {
            $next = array_shift($parts);
            if (isset($ref[$next]) && true === $ref[$next]) {
                // Skip any sub-properties if their parent prop is already marked for inclusion.
                break 2;
            }
            $ref[$next] = isset($ref[$next]) ? $ref[$next] : array();
            $ref =& $ref[$next];
        }
        $last = array_shift($parts);
        $ref[$last] = true;
    }
    if (wp_is_numeric_array($data)) {
        $new_data = array();
        foreach ($data as $item) {
            $new_data[] = _rest_array_intersect_key_recursive($item, $fields_as_keyed);
        }
    } else {
        $new_data = _rest_array_intersect_key_recursive($data, $fields_as_keyed);
    }
    $response->set_data($new_data);
    return $response;
}

WordPress Version: 5.3

/**
 * Filter the API response to include only a white-listed set of response object fields.
 *
 * @since 4.8.0
 *
 * @param WP_REST_Response $response Current response being served.
 * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request  $request  The request that was used to make current response.
 *
 * @return WP_REST_Response Response to be served, trimmed down to contain a subset of fields.
 */
function rest_filter_response_fields($response, $server, $request)
{
    if (!isset($request['_fields']) || $response->is_error()) {
        return $response;
    }
    $data = $response->get_data();
    $fields = wp_parse_list($request['_fields']);
    if (0 === count($fields)) {
        return $response;
    }
    // Trim off outside whitespace from the comma delimited list.
    $fields = array_map('trim', $fields);
    // Create nested array of accepted field hierarchy.
    $fields_as_keyed = array();
    foreach ($fields as $field) {
        $parts = explode('.', $field);
        $ref =& $fields_as_keyed;
        while (count($parts) > 1) {
            $next = array_shift($parts);
            if (isset($ref[$next]) && true === $ref[$next]) {
                // Skip any sub-properties if their parent prop is already marked for inclusion.
                break 2;
            }
            $ref[$next] = isset($ref[$next]) ? $ref[$next] : array();
            $ref =& $ref[$next];
        }
        $last = array_shift($parts);
        $ref[$last] = true;
    }
    if (wp_is_numeric_array($data)) {
        $new_data = array();
        foreach ($data as $item) {
            $new_data[] = _rest_array_intersect_key_recursive($item, $fields_as_keyed);
        }
    } else {
        $new_data = _rest_array_intersect_key_recursive($data, $fields_as_keyed);
    }
    $response->set_data($new_data);
    return $response;
}

WordPress Version: 5.1

/**
 * Filter the API response to include only a white-listed set of response object fields.
 *
 * @since 4.8.0
 *
 * @param WP_REST_Response $response Current response being served.
 * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request  $request  The request that was used to make current response.
 *
 * @return WP_REST_Response Response to be served, trimmed down to contain a subset of fields.
 */
function rest_filter_response_fields($response, $server, $request)
{
    if (!isset($request['_fields']) || $response->is_error()) {
        return $response;
    }
    $data = $response->get_data();
    $fields = wp_parse_list($request['_fields']);
    if (0 === count($fields)) {
        return $response;
    }
    // Trim off outside whitespace from the comma delimited list.
    $fields = array_map('trim', $fields);
    $fields_as_keyed = array_combine($fields, array_fill(0, count($fields), true));
    if (wp_is_numeric_array($data)) {
        $new_data = array();
        foreach ($data as $item) {
            $new_data[] = array_intersect_key($item, $fields_as_keyed);
        }
    } else {
        $new_data = array_intersect_key($data, $fields_as_keyed);
    }
    $response->set_data($new_data);
    return $response;
}

WordPress Version: 4.9

/**
 * Filter the API response to include only a white-listed set of response object fields.
 *
 * @since 4.8.0
 *
 * @param WP_REST_Response $response Current response being served.
 * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request  $request  The request that was used to make current response.
 *
 * @return WP_REST_Response Response to be served, trimmed down to contain a subset of fields.
 */
function rest_filter_response_fields($response, $server, $request)
{
    if (!isset($request['_fields']) || $response->is_error()) {
        return $response;
    }
    $data = $response->get_data();
    $fields = is_array($request['_fields']) ? $request['_fields'] : preg_split('/[\s,]+/', $request['_fields']);
    if (0 === count($fields)) {
        return $response;
    }
    // Trim off outside whitespace from the comma delimited list.
    $fields = array_map('trim', $fields);
    $fields_as_keyed = array_combine($fields, array_fill(0, count($fields), true));
    if (wp_is_numeric_array($data)) {
        $new_data = array();
        foreach ($data as $item) {
            $new_data[] = array_intersect_key($item, $fields_as_keyed);
        }
    } else {
        $new_data = array_intersect_key($data, $fields_as_keyed);
    }
    $response->set_data($new_data);
    return $response;
}