WordPress Version: 7.1
/**
* Validates an object value based on a schema.
*
* @since 5.7.0
*
* @param mixed $value The value to validate.
* @param array $args Schema array to use for validation.
* @param string $param The parameter name, used in error messages.
* @return true|WP_Error
*/
function rest_validate_object_value_from_schema($value, $args, $param)
{
if (!rest_is_object($value)) {
return new WP_Error(
'rest_invalid_type',
/* translators: 1: Parameter, 2: Type name. */
sprintf(__('%1$s is not of type %2$s.'), $param, 'object'),
array('param' => $param)
);
}
$value = rest_sanitize_object($value);
if (isset($args['required']) && is_array($args['required'])) {
// schema version 4
foreach ($args['required'] as $name) {
if (!array_key_exists($name, $value)) {
return new WP_Error(
'rest_property_required',
/* translators: 1: Property of an object, 2: Parameter. */
sprintf(__('%1$s is a required property of %2$s.'), $name, $param)
);
}
}
} elseif (isset($args['properties'])) {
// schema version 3
foreach ($args['properties'] as $name => $property) {
if (isset($property['required']) && true === $property['required'] && !array_key_exists($name, $value)) {
return new WP_Error(
'rest_property_required',
/* translators: 1: Property of an object, 2: Parameter. */
sprintf(__('%1$s is a required property of %2$s.'), $name, $param)
);
}
}
}
foreach ($value as $property => $v) {
if (isset($args['properties'][$property])) {
$is_valid = rest_validate_value_from_schema($v, $args['properties'][$property], $param . '[' . $property . ']');
if (is_wp_error($is_valid)) {
return $is_valid;
}
continue;
}
$pattern_property_schema = rest_find_matching_pattern_property_schema($property, $args);
if (null !== $pattern_property_schema) {
$is_valid = rest_validate_value_from_schema($v, $pattern_property_schema, $param . '[' . $property . ']');
if (is_wp_error($is_valid)) {
return $is_valid;
}
continue;
}
if (isset($args['additionalProperties'])) {
if (false === $args['additionalProperties']) {
return new WP_Error(
'rest_additional_properties_forbidden',
/* translators: %s: Property of an object. */
sprintf(__('%1$s is not a valid property of Object.'), $property)
);
}
if (is_array($args['additionalProperties'])) {
$is_valid = rest_validate_value_from_schema($v, $args['additionalProperties'], $param . '[' . $property . ']');
if (is_wp_error($is_valid)) {
return $is_valid;
}
}
}
}
if (isset($args['minProperties']) && count($value) < $args['minProperties']) {
return new WP_Error('rest_too_few_properties', sprintf(
/* translators: 1: Parameter, 2: Number. */
_n('%1$s must contain at least %2$s property.', '%1$s must contain at least %2$s properties.', $args['minProperties']),
$param,
number_format_i18n($args['minProperties'])
));
}
if (isset($args['maxProperties']) && count($value) > $args['maxProperties']) {
return new WP_Error('rest_too_many_properties', sprintf(
/* translators: 1: Parameter, 2: Number. */
_n('%1$s must contain at most %2$s property.', '%1$s must contain at most %2$s properties.', $args['maxProperties']),
$param,
number_format_i18n($args['maxProperties'])
));
}
return true;
}