WP_REST_Server::get_data_for_route PHP Method

get_data_for_route() public method

Retrieves publicly-visible data for the route.
Since: 4.4.0
public get_data_for_route ( string $route, array $callbacks, string $context = 'view' ) : array | null
$route string Route to get data for.
$callbacks array Callbacks to convert to data.
$context string Optional. Context for the data. Accepts 'view' or 'help'. Default 'view'.
return array | null Data for the route, or null if no publicly-visible data.
    public function get_data_for_route($route, $callbacks, $context = 'view')
    {
        $data = array('namespace' => '', 'methods' => array(), 'endpoints' => array());
        if (isset($this->route_options[$route])) {
            $options = $this->route_options[$route];
            if (isset($options['namespace'])) {
                $data['namespace'] = $options['namespace'];
            }
            if (isset($options['schema']) && 'help' === $context) {
                $data['schema'] = call_user_func($options['schema']);
            }
        }
        $route = preg_replace('#\\(\\?P<(\\w+?)>.*?\\)#', '{$1}', $route);
        foreach ($callbacks as $callback) {
            // Skip to the next route if any callback is hidden.
            if (empty($callback['show_in_index'])) {
                continue;
            }
            $data['methods'] = array_merge($data['methods'], array_keys($callback['methods']));
            $endpoint_data = array('methods' => array_keys($callback['methods']));
            if (isset($callback['args'])) {
                $endpoint_data['args'] = array();
                foreach ($callback['args'] as $key => $opts) {
                    $arg_data = array('required' => !empty($opts['required']));
                    if (isset($opts['default'])) {
                        $arg_data['default'] = $opts['default'];
                    }
                    if (isset($opts['enum'])) {
                        $arg_data['enum'] = $opts['enum'];
                    }
                    if (isset($opts['description'])) {
                        $arg_data['description'] = $opts['description'];
                    }
                    if (isset($opts['type'])) {
                        $arg_data['type'] = $opts['type'];
                    }
                    if (isset($opts['items'])) {
                        $arg_data['items'] = $opts['items'];
                    }
                    $endpoint_data['args'][$key] = $arg_data;
                }
            }
            $data['endpoints'][] = $endpoint_data;
            // For non-variable routes, generate links.
            if (strpos($route, '{') === false) {
                $data['_links'] = array('self' => rest_url($route));
            }
        }
        if (empty($data['methods'])) {
            // No methods supported, hide the route.
            return null;
        }
        return $data;
    }

Usage Example

Example #1
0
/**
 * Handles OPTIONS requests for the server.
 *
 * This is handled outside of the server code, as it doesn't obey normal route
 * mapping.
 *
 * @since 4.4.0
 *
 * @param mixed           $response Current response, either response or `null` to indicate pass-through.
 * @param WP_REST_Server  $handler  ResponseHandler instance (usually WP_REST_Server).
 * @param WP_REST_Request $request  The request that was used to make current response.
 * @return WP_REST_Response Modified response, either response or `null` to indicate pass-through.
 */
function rest_handle_options_request($response, $handler, $request)
{
    if (!empty($response) || $request->get_method() !== 'OPTIONS') {
        return $response;
    }
    $response = new WP_REST_Response();
    $data = array();
    foreach ($handler->get_routes() as $route => $endpoints) {
        $match = preg_match('@^' . $route . '[email protected]', $request->get_route());
        if (!$match) {
            continue;
        }
        $data = $handler->get_data_for_route($route, $endpoints, 'help');
        $response->set_matched_route($route);
        break;
    }
    $response->set_data($data);
    return $response;
}
All Usage Examples Of WP_REST_Server::get_data_for_route