WordPress.org

Make WordPress Core

Ticket #42810: 42810.diff

File 42810.diff, 2.6 KB (added by TimothyBlynJacobs, 4 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 e0b4144..b332255 100644
    a b abstract class WP_REST_Meta_Fields { 
    311311                $old_value = get_metadata( $meta_type, $object_id, $meta_key );
    312312
    313313                if ( 1 === count( $old_value ) ) {
    314                         if ( $old_value[0] === $meta_value ) {
     314                        if ( $old_value[0] === sanitize_meta( $meta_key, $meta_value, $meta_type ) ) {
    315315                                return true;
    316316                        }
    317317                }
  • 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 dc7c72e..92cd225 100644
    a b class WP_Test_REST_Post_Meta_Fields extends WP_Test_REST_TestCase { 
    120120                        )
    121121                );
    122122
     123                register_meta( 'post', 'test_sanitized', array(
     124                        'single'            => true,
     125                        'show_in_rest'      => true,
     126                        'type'              => 'string',
     127                        'sanitize_callback' => array( $this, 'set_duplicate_single_value_after_sanitization_sanitize_callback' ),
     128                ) );
     129
    123130                /** @var WP_REST_Server $wp_rest_server */
    124131                global $wp_rest_server;
    125132                $this->server = $wp_rest_server = new Spy_REST_Server;
    class WP_Test_REST_Post_Meta_Fields extends WP_Test_REST_TestCase { 
    355362                $this->assertEquals( 'test_value', $meta['test_single'] );
    356363        }
    357364
     365        public function test_set_duplicate_single_value_after_sanitization() {
     366
     367                $value     = 'abc5def';
     368                $sanitized = 'abcdef';
     369                update_post_meta( self::$post_id, 'test_sanitized', $value );
     370
     371                $this->grant_write_permission();
     372
     373                $data    = array(
     374                        'meta' => array(
     375                                'test_sanitized' => $value,
     376                        ),
     377                );
     378                $request = new WP_REST_Request( 'POST', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     379                $request->set_body_params( $data );
     380
     381                $response = $this->server->dispatch( $request );
     382                $this->assertEquals( 200, $response->get_status() );
     383
     384                $meta = get_post_meta( self::$post_id, 'test_sanitized', true );
     385                $this->assertNotEmpty( $meta );
     386                $this->assertEquals( $sanitized, $meta );
     387
     388                $data = $response->get_data();
     389                $meta = (array) $data['meta'];
     390                $this->assertArrayHasKey( 'test_sanitized', $meta );
     391                $this->assertEquals( $sanitized, $meta['test_sanitized'] );
     392        }
     393
     394        public function set_duplicate_single_value_after_sanitization_sanitize_callback( $value ) {
     395                return preg_replace( '/[^a-z]/', '', $value );
     396        }
     397
    358398        /**
    359399         * @depends test_set_value
    360400         */