Make WordPress Core

Ticket #47928: 47928.3.diff

File 47928.3.diff, 3.6 KB (added by TimothyBlynJacobs, 2 years ago)
  • src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php

    diff --git a/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php b/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php
    index 5b7240ddc6..490cf346b8 100644
    a b abstract class WP_REST_Meta_Fields { 
    350350                // Do the exact same check for a duplicate value as in update_metadata() to avoid update_metadata() returning false.
    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                        }
    358366                }
  • tests/phpunit/tests/rest-api/rest-post-meta-fields.php

    diff --git a/tests/phpunit/tests/rest-api/rest-post-meta-fields.php b/tests/phpunit/tests/rest-api/rest-post-meta-fields.php
    index 71bcfdcd87..1db1798fd6 100644
    a b class WP_Test_REST_Post_Meta_Fields extends WP_Test_REST_TestCase { 
    21202120                $this->assertEquals( array( 'BuddyPress' ), $meta[1] );
    21212121        }
    21222122
     2123        /**
     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
    21232207        /**
    21242208         * Internal function used to disable an insert query which
    21252209         * will trigger a wpdb error for testing purposes.