REST API: Support for objects in schema validation and sanitization.

When registering routes developers can now define their complex objects in the schema and benefit from the automatic validation and sanitization in the REST API. This also paves the way for support for complex object registration via register_meta and register_setting.

See #38583.
Props TimothyBlynJacobs5.

git-svn-id: https://develop.svn.wordpress.org/trunk@41727 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Joe Hoyle
2017-10-04 08:26:44 +00:00
parent 3f1de03834
commit 6b533ba2b0
6 changed files with 179 additions and 0 deletions

View File

@@ -1051,6 +1051,28 @@ function rest_validate_value_from_schema( $value, $args, $param = '' ) {
}
}
}
if ( 'object' === $args['type'] ) {
if ( $value instanceof stdClass ) {
$value = (array) $value;
}
if ( ! is_array( $value ) ) {
/* translators: 1: parameter, 2: type name */
return new WP_Error( 'rest_invalid_param', sprintf( __( '%1$s is not of type %2$s.' ), $param, 'object' ) );
}
foreach ( $value as $property => $v ) {
if ( ! isset( $args['properties'][ $property ] ) ) {
continue;
}
$is_valid = rest_validate_value_from_schema( $v, $args['properties'][ $property ], $param . '[' . $property . ']' );
if ( is_wp_error( $is_valid ) ) {
return $is_valid;
}
}
}
if ( ! empty( $args['enum'] ) ) {
if ( ! in_array( $value, $args['enum'], true ) ) {
/* translators: 1: parameter, 2: list of valid values */
@@ -1170,6 +1192,26 @@ function rest_sanitize_value_from_schema( $value, $args ) {
$value = array_values( $value );
return $value;
}
if ( 'object' === $args['type'] ) {
if ( $value instanceof stdClass ) {
$value = (array) $value;
}
if ( ! is_array( $value ) ) {
return array();
}
foreach ( $value as $property => $v ) {
if ( ! isset( $args['properties'][ $property ] ) ) {
unset( $value[ $property ] );
continue;
}
$value[ $property ] = rest_sanitize_value_from_schema( $v, $args['properties'][ $property ] );
}
return $value;
}
if ( 'integer' === $args['type'] ) {
return (int) $value;
}