WP_REST_Server::match_request_to_handler()protectedWP 5.6.0

Matches a request object to its handler.

Метод класса: WP_REST_Server{}

Внутренняя функция — эта функция рассчитана на использование самим ядром. Не рекомендуется использовать эту функцию в своем коде.

Хуков нет.

Возвращает

Массив|WP_Error. The route and request handler on success or a WP_Error instance if no handler was found.

Использование

// protected - в коде основоного (родительского) или дочернего класса
$result = $this->match_request_to_handler( $request );
$request(WP_REST_Request) (обязательный)
The request object.

Список изменений

С версии 5.6.0 Введена.

Код WP_REST_Server::match_request_to_handler() WP 6.4.3

protected function match_request_to_handler( $request ) {
	$method = $request->get_method();
	$path   = $request->get_route();

	$with_namespace = array();

	foreach ( $this->get_namespaces() as $namespace ) {
		if ( str_starts_with( trailingslashit( ltrim( $path, '/' ) ), $namespace ) ) {
			$with_namespace[] = $this->get_routes( $namespace );
		}
	}

	if ( $with_namespace ) {
		$routes = array_merge( ...$with_namespace );
	} else {
		$routes = $this->get_routes();
	}

	foreach ( $routes as $route => $handlers ) {
		$match = preg_match( '@^' . $route . '$@i', $path, $matches );

		if ( ! $match ) {
			continue;
		}

		$args = array();

		foreach ( $matches as $param => $value ) {
			if ( ! is_int( $param ) ) {
				$args[ $param ] = $value;
			}
		}

		foreach ( $handlers as $handler ) {
			$callback = $handler['callback'];

			// Fallback to GET method if no HEAD method is registered.
			$checked_method = $method;
			if ( 'HEAD' === $method && empty( $handler['methods']['HEAD'] ) ) {
				$checked_method = 'GET';
			}
			if ( empty( $handler['methods'][ $checked_method ] ) ) {
				continue;
			}

			if ( ! is_callable( $callback ) ) {
				return array( $route, $handler );
			}

			$request->set_url_params( $args );
			$request->set_attributes( $handler );

			$defaults = array();

			foreach ( $handler['args'] as $arg => $options ) {
				if ( isset( $options['default'] ) ) {
					$defaults[ $arg ] = $options['default'];
				}
			}

			$request->set_default_params( $defaults );

			return array( $route, $handler );
		}
	}

	return new WP_Error(
		'rest_no_route',
		__( 'No route was found matching the URL and request method.' ),
		array( 'status' => 404 )
	);
}