WordPress Version: 5.6
/**
* 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 = rest_get_allowed_schema_keywords();
$valid_schema_properties = array_diff($valid_schema_properties, array('default', 'required'));
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 (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;
}