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;
}
/** * 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; }