Make WordPress Core

Changeset 57611


Ignore:
Timestamp:
02/13/2024 09:55:38 AM (10 months ago)
Author:
spacedmonkey
Message:

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.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php

    r56075 r57611  
    142142    public function update_value( $meta, $object_id ) {
    143143        $fields = $this->get_registered_fields();
     144        $error  = new WP_Error();
    144145
    145146        foreach ( $fields as $meta_key => $args ) {
     
    164165
    165166                    if ( is_wp_error( rest_validate_value_from_schema( $current, $args['schema'] ) ) ) {
    166                         return new WP_Error(
     167                        $error->add(
    167168                            'rest_invalid_stored_value',
    168169                            /* translators: %s: Custom field key. */
     
    170171                            array( 'status' => 500 )
    171172                        );
     173                        continue;
    172174                    }
    173175                }
     
    175177                $result = $this->delete_meta_value( $object_id, $meta_key, $name );
    176178                if ( is_wp_error( $result ) ) {
    177                     return $result;
     179                    $error->merge_from( $result );
    178180                }
    179181                continue;
     
    181183
    182184            if ( ! $args['single'] && is_array( $value ) && count( array_filter( $value, 'is_null' ) ) ) {
    183                 return new WP_Error(
     185                $error->add(
    184186                    'rest_invalid_stored_value',
    185187                    /* translators: %s: Custom field key. */
     
    187189                    array( 'status' => 500 )
    188190                );
     191                continue;
    189192            }
    190193
     
    192195            if ( is_wp_error( $is_valid ) ) {
    193196                $is_valid->add_data( array( 'status' => 400 ) );
    194                 return $is_valid;
     197                $error->merge_from( $is_valid );
     198                continue;
    195199            }
    196200
     
    204208
    205209            if ( is_wp_error( $result ) ) {
    206                 return $result;
    207             }
     210                $error->merge_from( $result );
     211                continue;
     212            }
     213        }
     214
     215        if ( $error->has_errors() ) {
     216            return $error;
    208217        }
    209218
  • trunk/tests/phpunit/tests/rest-api/rest-post-meta-fields.php

    r56745 r57611  
    30973097
    30983098    /**
     3099     * @ticket 48823
     3100     */
     3101    public function test_multiple_errors_are_returned_at_once() {
     3102        $this->grant_write_permission();
     3103        register_post_meta(
     3104            'post',
     3105            'error_1',
     3106            array(
     3107                'single'       => true,
     3108                'show_in_rest' => array(
     3109                    'schema' => array(
     3110                        'enum' => array( 'a', 'b' ),
     3111                    ),
     3112                ),
     3113            )
     3114        );
     3115        register_post_meta(
     3116            'post',
     3117            'error_2',
     3118            array(
     3119                'single'       => true,
     3120                'show_in_rest' => array(
     3121                    'schema' => array(
     3122                        'minLength' => 1,
     3123                    ),
     3124                ),
     3125            )
     3126        );
     3127
     3128        $request = new WP_REST_Request( 'PUT', '/wp/v2/posts/' . self::$post_id );
     3129        $request->set_body_params(
     3130            array(
     3131                'meta' => array(
     3132                    'error_1' => 'c',
     3133                    'error_2' => '',
     3134                ),
     3135            )
     3136        );
     3137        $response = rest_do_request( $request );
     3138        $error    = $response->as_error();
     3139        $this->assertWPError( $error );
     3140        $this->assertContains( 'meta.error_1 is not one of a and b.', $error->get_error_messages() );
     3141        $this->assertContains( 'meta.error_2 must be at least 1 character long.', $error->get_error_messages() );
     3142    }
     3143
     3144    /**
    30993145     * Internal function used to disable an insert query which
    31003146     * will trigger a wpdb error for testing purposes.
Note: See TracChangeset for help on using the changeset viewer.