From 55c21acc9f13397e1dce576065f2af5a6d3e2d46 Mon Sep 17 00:00:00 2001 From: TimothyBlynJacobs Date: Mon, 7 Sep 2020 02:37:07 +0000 Subject: [PATCH] REST API: Extract `WP_REST_Controller::get_endpoint_args_for_item_schema()` to a standalone function. This method is useful whenever a JSON Schema needs to be converted to a format suitable for argument validation with `WP_REST_Request`. Moving the logic into a standalone function allows developers to use it outside of the `WP_REST_Controller` context. Props pentatonicfunk. Fixes #50876. Built from https://develop.svn.wordpress.org/trunk@48951 git-svn-id: http://core.svn.wordpress.org/trunk@48713 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/rest-api.php | 85 +++++++++++++++++++ .../endpoints/class-wp-rest-controller.php | 73 +--------------- wp-includes/version.php | 2 +- 3 files changed, 87 insertions(+), 73 deletions(-) diff --git a/wp-includes/rest-api.php b/wp-includes/rest-api.php index 83b724511a..cbad102bbe 100644 --- a/wp-includes/rest-api.php +++ b/wp-includes/rest-api.php @@ -2258,3 +2258,88 @@ function rest_get_queried_resource_route() { */ return apply_filters( 'rest_queried_resource_route', $route ); } + +/** + * Retrieves an array of endpoint arguments from the item schema and endpoint method. + * + * @since 5.6.0 + * + * @param array $schema The full JSON schema for the endpoint. + * @param string $method Optional. HTTP method of the endpoint. The arguments for `CREATABLE` endpoints are + * checked for required values and may fall-back to a given default, this is not done + * on `EDITABLE` endpoints. Default WP_REST_Server::CREATABLE. + * @return array The endpoint arguments. + */ +function rest_get_endpoint_args_for_schema( $schema, $method = WP_REST_Server::CREATABLE ) { + + $schema_properties = ! empty( $schema['properties'] ) ? $schema['properties'] : array(); + $endpoint_args = array(); + $valid_schema_properties = array( + 'type', + 'format', + 'enum', + 'items', + 'properties', + 'additionalProperties', + 'minimum', + 'maximum', + 'exclusiveMinimum', + 'exclusiveMaximum', + 'minLength', + 'maxLength', + 'pattern', + 'minItems', + 'maxItems', + 'uniqueItems', + ); + + foreach ( $schema_properties as $field_id => $params ) { + + // Arguments specified as `readonly` are not allowed to be set. + if ( ! empty( $params['readonly'] ) ) { + continue; + } + + $endpoint_args[ $field_id ] = array( + 'validate_callback' => 'rest_validate_request_arg', + 'sanitize_callback' => 'rest_sanitize_request_arg', + ); + + if ( isset( $params['description'] ) ) { + $endpoint_args[ $field_id ]['description'] = $params['description']; + } + + if ( WP_REST_Server::CREATABLE === $method && isset( $params['default'] ) ) { + $endpoint_args[ $field_id ]['default'] = $params['default']; + } + + if ( WP_REST_Server::CREATABLE === $method && ! empty( $params['required'] ) ) { + $endpoint_args[ $field_id ]['required'] = true; + } + + foreach ( $valid_schema_properties as $schema_prop ) { + if ( isset( $params[ $schema_prop ] ) ) { + $endpoint_args[ $field_id ][ $schema_prop ] = $params[ $schema_prop ]; + } + } + + // Merge in any options provided by the schema property. + if ( isset( $params['arg_options'] ) ) { + + // Only use required / default from arg_options on CREATABLE endpoints. + if ( WP_REST_Server::CREATABLE !== $method ) { + $params['arg_options'] = array_diff_key( + $params['arg_options'], + array( + 'required' => '', + 'default' => '', + ) + ); + } + + $endpoint_args[ $field_id ] = array_merge( $endpoint_args[ $field_id ], $params['arg_options'] ); + } + } + + return $endpoint_args; +} diff --git a/wp-includes/rest-api/endpoints/class-wp-rest-controller.php b/wp-includes/rest-api/endpoints/class-wp-rest-controller.php index 44880aaec2..d0d77d7ec1 100644 --- a/wp-includes/rest-api/endpoints/class-wp-rest-controller.php +++ b/wp-includes/rest-api/endpoints/class-wp-rest-controller.php @@ -625,78 +625,7 @@ abstract class WP_REST_Controller { * @return array Endpoint arguments. */ public function get_endpoint_args_for_item_schema( $method = WP_REST_Server::CREATABLE ) { - - $schema = $this->get_item_schema(); - $schema_properties = ! empty( $schema['properties'] ) ? $schema['properties'] : array(); - $endpoint_args = array(); - $valid_schema_properties = array( - 'type', - 'format', - 'enum', - 'items', - 'properties', - 'additionalProperties', - 'minimum', - 'maximum', - 'exclusiveMinimum', - 'exclusiveMaximum', - 'minLength', - 'maxLength', - 'pattern', - 'minItems', - 'maxItems', - 'uniqueItems', - ); - - foreach ( $schema_properties as $field_id => $params ) { - - // Arguments specified as `readonly` are not allowed to be set. - if ( ! empty( $params['readonly'] ) ) { - continue; - } - - $endpoint_args[ $field_id ] = array( - 'validate_callback' => 'rest_validate_request_arg', - 'sanitize_callback' => 'rest_sanitize_request_arg', - ); - - if ( isset( $params['description'] ) ) { - $endpoint_args[ $field_id ]['description'] = $params['description']; - } - - if ( WP_REST_Server::CREATABLE === $method && isset( $params['default'] ) ) { - $endpoint_args[ $field_id ]['default'] = $params['default']; - } - - if ( WP_REST_Server::CREATABLE === $method && ! empty( $params['required'] ) ) { - $endpoint_args[ $field_id ]['required'] = true; - } - - foreach ( $valid_schema_properties as $schema_prop ) { - if ( isset( $params[ $schema_prop ] ) ) { - $endpoint_args[ $field_id ][ $schema_prop ] = $params[ $schema_prop ]; - } - } - - // Merge in any options provided by the schema property. - if ( isset( $params['arg_options'] ) ) { - - // Only use required / default from arg_options on CREATABLE endpoints. - if ( WP_REST_Server::CREATABLE !== $method ) { - $params['arg_options'] = array_diff_key( - $params['arg_options'], - array( - 'required' => '', - 'default' => '', - ) - ); - } - - $endpoint_args[ $field_id ] = array_merge( $endpoint_args[ $field_id ], $params['arg_options'] ); - } - } - - return $endpoint_args; + return rest_get_endpoint_args_for_schema( $this->get_item_schema(), $method ); } /** diff --git a/wp-includes/version.php b/wp-includes/version.php index a798d75e79..0fa8b8da86 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.6-alpha-48950'; +$wp_version = '5.6-alpha-48951'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.