rest_validate_object_value_from_schema

The timeline below displays how wordpress function rest_validate_object_value_from_schema has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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

WordPress Version: 5.7

/**
 * 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',
            /* translators: 1: Parameter, 2: Number. */
            sprintf(_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',
            /* translators: 1: Parameter, 2: Number. */
            sprintf(_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;
}