REST API: Improve error handling in REST meta fields

This update modifies the error handling mechanism in the REST API meta fields functionality. Instead of halting execution and returning on the first encountered error, it now collects all errors in a WP_Error object and continues execution. Thus, this enhancement enables handling and displaying of multiple errors in a single response, improving the debugging process. 

Props TimothyBlynJacobs, spacedmonkey, hellofromTonya, oglekler. 
Fixes #48823.
Built from https://develop.svn.wordpress.org/trunk@57611


git-svn-id: http://core.svn.wordpress.org/trunk@57112 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
spacedmonkey 2024-02-13 09:57:08 +00:00
parent 31a092799f
commit 9df3515569
2 changed files with 15 additions and 6 deletions

View File

@ -141,6 +141,7 @@ abstract class WP_REST_Meta_Fields {
*/ */
public function update_value( $meta, $object_id ) { public function update_value( $meta, $object_id ) {
$fields = $this->get_registered_fields(); $fields = $this->get_registered_fields();
$error = new WP_Error();
foreach ( $fields as $meta_key => $args ) { foreach ( $fields as $meta_key => $args ) {
$name = $args['name']; $name = $args['name'];
@ -163,35 +164,38 @@ abstract class WP_REST_Meta_Fields {
$current = get_metadata( $this->get_meta_type(), $object_id, $meta_key, true ); $current = get_metadata( $this->get_meta_type(), $object_id, $meta_key, true );
if ( is_wp_error( rest_validate_value_from_schema( $current, $args['schema'] ) ) ) { if ( is_wp_error( rest_validate_value_from_schema( $current, $args['schema'] ) ) ) {
return new WP_Error( $error->add(
'rest_invalid_stored_value', 'rest_invalid_stored_value',
/* translators: %s: Custom field key. */ /* translators: %s: Custom field key. */
sprintf( __( 'The %s property has an invalid stored value, and cannot be updated to null.' ), $name ), sprintf( __( 'The %s property has an invalid stored value, and cannot be updated to null.' ), $name ),
array( 'status' => 500 ) array( 'status' => 500 )
); );
continue;
} }
} }
$result = $this->delete_meta_value( $object_id, $meta_key, $name ); $result = $this->delete_meta_value( $object_id, $meta_key, $name );
if ( is_wp_error( $result ) ) { if ( is_wp_error( $result ) ) {
return $result; $error->merge_from( $result );
} }
continue; continue;
} }
if ( ! $args['single'] && is_array( $value ) && count( array_filter( $value, 'is_null' ) ) ) { if ( ! $args['single'] && is_array( $value ) && count( array_filter( $value, 'is_null' ) ) ) {
return new WP_Error( $error->add(
'rest_invalid_stored_value', 'rest_invalid_stored_value',
/* translators: %s: Custom field key. */ /* translators: %s: Custom field key. */
sprintf( __( 'The %s property has an invalid stored value, and cannot be updated to null.' ), $name ), sprintf( __( 'The %s property has an invalid stored value, and cannot be updated to null.' ), $name ),
array( 'status' => 500 ) array( 'status' => 500 )
); );
continue;
} }
$is_valid = rest_validate_value_from_schema( $value, $args['schema'], 'meta.' . $name ); $is_valid = rest_validate_value_from_schema( $value, $args['schema'], 'meta.' . $name );
if ( is_wp_error( $is_valid ) ) { if ( is_wp_error( $is_valid ) ) {
$is_valid->add_data( array( 'status' => 400 ) ); $is_valid->add_data( array( 'status' => 400 ) );
return $is_valid; $error->merge_from( $is_valid );
continue;
} }
$value = rest_sanitize_value_from_schema( $value, $args['schema'] ); $value = rest_sanitize_value_from_schema( $value, $args['schema'] );
@ -203,10 +207,15 @@ abstract class WP_REST_Meta_Fields {
} }
if ( is_wp_error( $result ) ) { if ( is_wp_error( $result ) ) {
return $result; $error->merge_from( $result );
continue;
} }
} }
if ( $error->has_errors() ) {
return $error;
}
return null; return null;
} }

View File

@ -16,7 +16,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '6.5-alpha-57610'; $wp_version = '6.5-alpha-57611';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.