Make WordPress Core

Changeset 45903


Ignore:
Timestamp:
08/28/2019 03:07:03 AM (5 years ago)
Author:
kadamwhite
Message:

REST API: Only cast scalar types to string when comparing new & old meta values.

Newly-supported array and object meta types should not be cast to strings.

Props TimothyBlynJacobs, caercam.
Fixes #47928.

Location:
trunk
Files:
2 edited

Legend:

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

    r45807 r45903  
    351351        $old_value = get_metadata( $meta_type, $object_id, $meta_key );
    352352        $subtype   = get_object_subtype( $meta_type, $object_id );
     353        $args      = $this->get_registered_fields()[ $meta_key ];
    353354
    354355        if ( 1 === count( $old_value ) ) {
    355             if ( (string) sanitize_meta( $meta_key, $value, $meta_type, $subtype ) === $old_value[0] ) {
     356            $sanitized = sanitize_meta( $meta_key, $value, $meta_type, $subtype );
     357
     358            if ( in_array( $args['type'], array( 'string', 'number', 'integer', 'boolean' ), true ) ) {
     359                // The return value of get_metadata will always be a string for scalar types.
     360                $sanitized = (string) $sanitized;
     361            }
     362
     363            if ( $sanitized === $old_value[0] ) {
    356364                return true;
    357365            }
  • trunk/tests/phpunit/tests/rest-api/rest-post-meta-fields.php

    r45807 r45903  
    21222122
    21232123    /**
     2124     * @ticket 47928
     2125     */
     2126    public function test_update_meta_with_unchanged_array_values() {
     2127        register_post_meta(
     2128            'post',
     2129            'list',
     2130            array(
     2131                'single'       => true,
     2132                'type'         => 'array',
     2133                'show_in_rest' => array(
     2134                    'schema' => array(
     2135                        'type'  => 'array',
     2136                        'items' => array(
     2137                            'type' => 'string',
     2138                        ),
     2139                    ),
     2140                ),
     2141            )
     2142        );
     2143
     2144        add_post_meta( self::$post_id, 'list', array( 'WordCamp' ) );
     2145
     2146        $this->grant_write_permission();
     2147
     2148        $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     2149        $request->set_body_params(
     2150            array(
     2151                'meta' => array(
     2152                    'list' => array( 'WordCamp' ),
     2153                ),
     2154            )
     2155        );
     2156
     2157        $response = rest_get_server()->dispatch( $request );
     2158        $this->assertEquals( 200, $response->get_status() );
     2159
     2160        $data = $response->get_data();
     2161        $this->assertEquals( array( 'WordCamp' ), $data['meta']['list'] );
     2162    }
     2163
     2164    /**
     2165     * @ticket 47928
     2166     */
     2167    public function test_update_meta_with_unchanged_object_values() {
     2168        register_post_meta(
     2169            'post',
     2170            'object',
     2171            array(
     2172                'single'       => true,
     2173                'type'         => 'object',
     2174                'show_in_rest' => array(
     2175                    'schema' => array(
     2176                        'type'       => 'object',
     2177                        'properties' => array(
     2178                            'project' => array(
     2179                                'type' => 'string',
     2180                            ),
     2181                        ),
     2182                    ),
     2183                ),
     2184            )
     2185        );
     2186
     2187        add_post_meta( self::$post_id, 'object', array( 'project' => 'WordCamp' ) );
     2188
     2189        $this->grant_write_permission();
     2190
     2191        $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     2192        $request->set_body_params(
     2193            array(
     2194                'meta' => array(
     2195                    'object' => array( 'project' => 'WordCamp' ),
     2196                ),
     2197            )
     2198        );
     2199
     2200        $response = rest_get_server()->dispatch( $request );
     2201        $this->assertEquals( 200, $response->get_status() );
     2202
     2203        $data = $response->get_data();
     2204        $this->assertEquals( array( 'project' => 'WordCamp' ), $data['meta']['object'] );
     2205    }
     2206
     2207    /**
    21242208     * Internal function used to disable an insert query which
    21252209     * will trigger a wpdb error for testing purposes.
Note: See TracChangeset for help on using the changeset viewer.