WordPress.org

Make WordPress Core

Ticket #48363: 48363.diff

File 48363.diff, 4.4 KB (added by TimothyBlynJacobs, 4 months 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 411fc5460c..08de9b9cf4 100644
    a b abstract class WP_REST_Meta_Fields { 
    430430                        $type = ! empty( $rest_args['schema']['type'] ) ? $rest_args['schema']['type'] : $type;
    431431
    432432                        if ( null === $rest_args['schema']['default'] ) {
    433                                 $rest_args['schema']['default'] = $this->get_default_for_type( $type );
     433                                $rest_args['schema']['default'] = self::get_default_for_type( $type );
    434434                        }
    435435
    436436                        $rest_args['schema'] = $this->default_additional_properties_to_false( $rest_args['schema'] );
    abstract class WP_REST_Meta_Fields { 
    501501                        $schema = $args['schema']['items'];
    502502                }
    503503
     504                if ( '' === $value ) {
     505                        $value = self::get_default_for_type( $schema['type'] );
     506                }
     507
    504508                if ( is_wp_error( rest_validate_value_from_schema( $value, $schema ) ) ) {
    505509                        return null;
    506510                }
    abstract class WP_REST_Meta_Fields { 
    566570         * @param string $type The schema type.
    567571         * @return mixed
    568572         */
    569         protected function get_default_for_type( $type ) {
     573        protected static function get_default_for_type( $type ) {
    570574                switch ( $type ) {
    571575                        case 'string':
    572576                                return '';
  • 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 39b167e782..e24e7aca40 100644
    a b class WP_Test_REST_Post_Meta_Fields extends WP_Test_REST_TestCase { 
    19791979
    19801980        /**
    19811981         * @ticket 43392
     1982         * @dataProvider _dp_meta_values_are_not_set_to_null_in_response_if_type_safely_serializable
    19821983         */
    1983         public function test_meta_values_are_not_set_to_null_in_response_if_type_safely_serializable() {
     1984        public function test_meta_values_are_not_set_to_null_in_response_if_type_safely_serializable( $type, $stored, $expected ) {
    19841985                register_post_meta(
    19851986                        'post',
    1986                         'boolean',
     1987                        'safe',
    19871988                        array(
    19881989                                'single'       => true,
    19891990                                'show_in_rest' => true,
    1990                                 'type'         => 'boolean',
     1991                                'type'         => $type,
    19911992                        )
    19921993                );
    19931994
    1994                 update_post_meta( self::$post_id, 'boolean', 'true' );
     1995                update_post_meta( self::$post_id, 'safe', $stored );
    19951996
    19961997                $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
    19971998                $response = rest_get_server()->dispatch( $request );
    19981999
    1999                 $this->assertTrue( $response->get_data()['meta']['boolean'] );
     2000                $this->assertSame( $expected, $response->get_data()['meta']['safe'] );
     2001        }
     2002
     2003        public function _dp_meta_values_are_not_set_to_null_in_response_if_type_safely_serializable() {
     2004                return array(
     2005                        array( 'boolean', 'true', true ),
     2006                        array( 'boolean', 'false', false ),
     2007                        array( 'boolean', '1', true ),
     2008                        array( 'boolean', '0', false ),
     2009                        array( 'boolean', '', false ),
     2010                        array( 'integer', '', 0 ),
     2011                        array( 'integer', '1', 1 ),
     2012                        array( 'integer', '0', 0 ),
     2013                        array( 'number', '', 0.0 ),
     2014                        array( 'number', '1.1', 1.1 ),
     2015                        array( 'number', '0.0', 0.0 ),
     2016                        array( 'string', '', '' ),
     2017                        array( 'string', '1', '1' ),
     2018                        array( 'string', '0', '0' ),
     2019                        array( 'string', 'str', 'str' ),
     2020                );
    20002021        }
    20012022
    20022023        /**
    class WP_Test_REST_Post_Meta_Fields extends WP_Test_REST_TestCase { 
    25982619                $this->assertSame( array( false, true ), get_post_meta( self::$post_id, 'items', true ) );
    25992620        }
    26002621
     2622        public function test_boolean_meta_update_to_false_stores_0() {
     2623                $this->grant_write_permission();
     2624
     2625                register_post_meta(
     2626                        'post',
     2627                        'boolean',
     2628                        array(
     2629                                'single'            => true,
     2630                                'type'              => 'boolean',
     2631                                'show_in_rest'      => true,
     2632                                'sanitize_callback' => function( $value ) {
     2633                                        return $value ? '1' : '0';
     2634                                },
     2635                        )
     2636                );
     2637
     2638                update_post_meta( self::$post_id, 'boolean', 1 );
     2639
     2640                $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     2641                $request->set_body_params(
     2642                        array(
     2643                                'meta' => array(
     2644                                        'boolean' => false,
     2645                                ),
     2646                        )
     2647                );
     2648
     2649                $response = rest_get_server()->dispatch( $request );
     2650                $this->assertEquals( 200, $response->get_status() );
     2651                $this->assertEquals( '0', get_post_meta( self::$post_id, 'boolean', true ) );
     2652        }
     2653
    26012654        /**
    26022655         * Internal function used to disable an insert query which
    26032656         * will trigger a wpdb error for testing purposes.