Make WordPress Core


Ignore:
Timestamp:
07/07/2020 08:45:55 PM (5 years ago)
Author:
TimothyBlynJacobs
Message:

REST API, Meta: Introduce support for default metadata values.

The register_meta() API now officially supports specifying a default metadata value. When get_metadata() is called for a meta key that does not yet exist for the object, this default value will be returned instead of an empty string.

A new function is introduced get_metadata_raw to retrieve the raw metadata value from the database, without applying the registered default.

Props spacedmonkey, flixos90, rmccue, kadamwhite, mnelson4, johnbillion, chrisvanpatten, TimothyBlynJacobs.
Fixes #43941.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/meta/registerMeta.php

    r46586 r48402  
    505505    }
    506506
     507    /**
     508     * @ticket 43941
     509     * @dataProvider data_get_default_data
     510     */
     511    public function test_get_default_value( $args, $single, $expected ) {
     512
     513        $object_type = 'post';
     514        $meta_key    = 'registered_key1';
     515        register_meta(
     516            $object_type,
     517            $meta_key,
     518            $args
     519        );
     520
     521        $object_property_name = $object_type . '_id';
     522        $object_id            = self::$$object_property_name;
     523        $default_value        = get_metadata_default( $object_type, $meta_key, $single, $object_id );
     524        $this->assertSame( $default_value, $expected );
     525
     526        // Check for default value.
     527        $value = get_metadata( $object_type, $object_id, $meta_key, $single );
     528        $this->assertSame( $value, $expected );
     529
     530        // Set value to check default is not being returned by mistake.
     531        $meta_value = 'dibble';
     532        update_metadata( $object_type, $object_id, $meta_key, $meta_value );
     533        $value = get_metadata( $object_type, $object_id, $meta_key, true );
     534        $this->assertSame( $value, $meta_value );
     535
     536        // Delete meta, make sure the default is returned.
     537        delete_metadata( $object_type, $object_id, $meta_key );
     538        $value = get_metadata( $object_type, $object_id, $meta_key, $single );
     539        $this->assertSame( $value, $expected );
     540
     541        // Set other meta key, to make sure other keys are not effects.
     542        $meta_value = 'hibble';
     543        $meta_key   = 'unregistered_key1';
     544        $value      = get_metadata( $object_type, $object_id, $meta_key, true );
     545        $this->assertSame( $value, '' );
     546        update_metadata( $object_type, $object_id, $meta_key, $meta_value );
     547        $value = get_metadata( $object_type, $object_id, $meta_key, true );
     548        $this->assertSame( $value, $meta_value );
     549
     550    }
     551
     552    /**
     553     * @ticket 43941
     554     * @dataProvider data_get_invalid_default_data
     555     */
     556    public function test_get_invalid_default_value( $args, $single, $expected ) {
     557        $this->setExpectedIncorrectUsage( 'register_meta' );
     558        $object_type = 'post';
     559        $meta_key    = 'registered_key1';
     560        $register    = register_meta(
     561            $object_type,
     562            $meta_key,
     563            $args
     564        );
     565
     566        $this->assertFalse( $register );
     567
     568        $object_property_name = $object_type . '_id';
     569        $object_id            = self::$$object_property_name;
     570        $default_value        = get_metadata_default( $object_type, $meta_key, $single, $object_id );
     571        $this->assertSame( $default_value, $expected );
     572    }
     573
    507574    public function filter_get_object_subtype_for_customtype( $subtype, $object_id ) {
    508575        if ( 1 === ( $object_id % 2 ) ) {
     
    511578
    512579        return 'even';
     580    }
     581
     582    public function data_get_default_data() {
     583        return array(
     584            'single string key with single ask '          => array(
     585                array(
     586                    'single'  => true,
     587                    'default' => 'wibble',
     588                ),
     589                true,
     590                'wibble',
     591            ),
     592            'single string key with multiple ask'         => array(
     593                array(
     594                    'single'  => true,
     595                    'default' => 'wibble',
     596                ),
     597                false,
     598                array( 'wibble' ),
     599            ),
     600            'multiple string key with single ask'         => array(
     601                array(
     602                    'single'  => false,
     603                    'default' => 'wibble',
     604                ),
     605                true,
     606                'wibble',
     607            ),
     608            'multiple string key with multiple ask'       => array(
     609                array(
     610                    'single'  => false,
     611                    'default' => 'wibble',
     612                ),
     613                false,
     614                array( 'wibble' ),
     615            ),
     616            'single array key with multiple ask'          => array(
     617                array(
     618                    'single'       => true,
     619                    'type'         => 'array',
     620                    'show_in_rest' => array(
     621                        'schema' => array(
     622                            'type'  => 'array',
     623                            'items' => array(
     624                                'type' => 'string',
     625                            ),
     626                        ),
     627                    ),
     628                    'default'      => array( 'wibble' ),
     629                ),
     630                false,
     631                array( array( 'wibble' ) ),
     632            ),
     633            'single string key with single ask for sub type' => array(
     634                array(
     635                    'single'         => true,
     636                    'object_subtype' => 'page',
     637                    'default'        => 'wibble',
     638                ),
     639                true,
     640                'wibble',
     641            ),
     642            'single string key with multiple ask for sub type' => array(
     643                array(
     644                    'single'         => true,
     645                    'object_subtype' => 'page',
     646                    'default'        => 'wibble',
     647                ),
     648                false,
     649                array( 'wibble' ),
     650            ),
     651            'single array key with multiple ask for sub type' => array(
     652                array(
     653                    'single'         => true,
     654                    'object_subtype' => 'page',
     655                    'show_in_rest'   => array(
     656                        'schema' => array(
     657                            'type'  => 'array',
     658                            'items' => array(
     659                                'type' => 'string',
     660                            ),
     661                        ),
     662                    ),
     663                    'default'        => array( 'wibble' ),
     664                ),
     665                false,
     666                array( array( 'wibble' ) ),
     667            ),
     668
     669            // types
     670            'single object key with single ask'           => array(
     671                array(
     672                    'single'       => true,
     673                    'show_in_rest' => array(
     674                        'schema' => array(
     675                            'type'       => 'object',
     676                            'properties' => array(
     677                                'wibble' => array(
     678                                    'type' => 'string',
     679                                ),
     680                            ),
     681                        ),
     682                    ),
     683                    'type'         => 'object',
     684                    'default'      => array( 'wibble' => 'dibble' ),
     685                ),
     686                true,
     687                array( 'wibble' => 'dibble' ),
     688            ),
     689            'single object key with multiple ask'         => array(
     690                array(
     691                    'single'       => true,
     692                    'show_in_rest' => array(
     693                        'schema' => array(
     694                            'type'       => 'object',
     695                            'properties' => array(
     696                                'wibble' => array(
     697                                    'type' => 'string',
     698                                ),
     699                            ),
     700                        ),
     701                    ),
     702                    'type'         => 'object',
     703                    'default'      => array( 'wibble' => 'dibble' ),
     704                ),
     705                false,
     706                array( array( 'wibble' => 'dibble' ) ),
     707            ),
     708            'multiple object key with single ask'         => array(
     709                array(
     710                    'show_in_rest' => array(
     711                        'schema' => array(
     712                            'type'       => 'object',
     713                            'properties' => array(
     714                                'wibble' => array(
     715                                    'type' => 'string',
     716                                ),
     717                            ),
     718                        ),
     719                    ),
     720                    'type'         => 'object',
     721                    'single'       => false,
     722                    'default'      => array( 'wibble' => 'dibble' ),
     723                ),
     724                true,
     725                array( 'wibble' => 'dibble' ),
     726            ),
     727            'multiple object key with multiple ask'       => array(
     728                array(
     729                    'show_in_rest' => array(
     730                        'schema' => array(
     731                            'type'       => 'object',
     732                            'properties' => array(
     733                                'wibble' => array(
     734                                    'type' => 'string',
     735                                ),
     736                            ),
     737                        ),
     738                    ),
     739                    'type'         => 'object',
     740                    'single'       => false,
     741                    'default'      => array( 'wibble' => 'dibble' ),
     742                ),
     743                false,
     744                array( array( 'wibble' => 'dibble' ) ),
     745            ),
     746            'single array key with multiple ask part two' => array(
     747                array(
     748                    'show_in_rest' => array(
     749                        'schema' => array(
     750                            'type'  => 'array',
     751                            'items' => array(
     752                                'type' => 'string',
     753                            ),
     754                        ),
     755                    ),
     756                    'single'       => true,
     757                    'type'         => 'array',
     758                    'default'      => array( 'dibble' ),
     759                ),
     760                false,
     761                array( array( 'dibble' ) ),
     762            ),
     763            'multiple array with multiple ask'            => array(
     764                array(
     765                    'show_in_rest' => array(
     766                        'schema' => array(
     767                            'type'  => 'array',
     768                            'items' => array(
     769                                'type' => 'string',
     770                            ),
     771                        ),
     772                    ),
     773                    'single'       => false,
     774                    'type'         => 'array',
     775                    'default'      => array( 'dibble' ),
     776                ),
     777                false,
     778                array( array( 'dibble' ) ),
     779            ),
     780            'single array with single ask'                => array(
     781                array(
     782                    'show_in_rest' => array(
     783                        'schema' => array(
     784                            'type'  => 'array',
     785                            'items' => array(
     786                                'type' => 'string',
     787                            ),
     788                        ),
     789                    ),
     790                    'single'       => true,
     791                    'type'         => 'array',
     792                    'default'      => array( 'dibble' ),
     793                ),
     794                true,
     795                array( 'dibble' ),
     796            ),
     797
     798            'multiple array with single ask'              => array(
     799                array(
     800                    'show_in_rest' => array(
     801                        'schema' => array(
     802                            'type'  => 'array',
     803                            'items' => array(
     804                                'type' => 'string',
     805                            ),
     806                        ),
     807                    ),
     808                    'single'       => false,
     809                    'type'         => 'array',
     810                    'default'      => array( 'dibble' ),
     811                ),
     812                true,
     813                array( 'dibble' ),
     814            ),
     815
     816            'single boolean with single ask'              => array(
     817                array(
     818                    'single'  => true,
     819                    'type'    => 'boolean',
     820                    'default' => true,
     821                ),
     822                true,
     823                true,
     824            ),
     825            'multiple boolean with single ask'            => array(
     826                array(
     827                    'single'  => false,
     828                    'type'    => 'boolean',
     829                    'default' => true,
     830                ),
     831                true,
     832                true,
     833            ),
     834            'single boolean with multiple ask'            => array(
     835                array(
     836                    'single'  => true,
     837                    'type'    => 'boolean',
     838                    'default' => true,
     839                ),
     840                false,
     841                array( true ),
     842            ),
     843            'multiple boolean with multiple ask'          => array(
     844                array(
     845                    'single'  => false,
     846                    'type'    => 'boolean',
     847                    'default' => true,
     848                ),
     849                false,
     850                array( true ),
     851            ),
     852
     853            'single integer with single ask'              => array(
     854                array(
     855                    'single'  => true,
     856                    'type'    => 'integer',
     857                    'default' => 123,
     858                ),
     859                true,
     860                123,
     861            ),
     862            'multiple integer with single ask'            => array(
     863                array(
     864                    'single'  => false,
     865                    'type'    => 'integer',
     866                    'default' => 123,
     867                ),
     868                true,
     869                123,
     870            ),
     871            'single integer with multiple ask'            => array(
     872                array(
     873                    'single'  => true,
     874                    'type'    => 'integer',
     875                    'default' => 123,
     876                ),
     877                false,
     878                array( 123 ),
     879            ),
     880            'multiple integer with multiple ask'          => array(
     881                array(
     882                    'single'  => false,
     883                    'type'    => 'integer',
     884                    'default' => 123,
     885                ),
     886                false,
     887                array( 123 ),
     888            ),
     889            'single array of objects with multiple ask'   => array(
     890                array(
     891                    'type'         => 'array',
     892                    'single'       => true,
     893                    'show_in_rest' => array(
     894                        'schema' => array(
     895                            'type'  => 'array',
     896                            'items' => array(
     897                                'type'       => 'object',
     898                                'properties' => array(
     899                                    'name' => array(
     900                                        'type' => 'string',
     901                                    ),
     902                                ),
     903                            ),
     904                        ),
     905                    ),
     906                    'default'      => array(
     907                        array(
     908                            'name' => 'Kirk',
     909                        ),
     910                    ),
     911                ),
     912                false,
     913                array(
     914                    array(
     915                        array(
     916                            'name' => 'Kirk',
     917                        ),
     918                    ),
     919                ),
     920            ),
     921        );
     922    }
     923
     924    public function data_get_invalid_default_data() {
     925        return array(
     926            array(
     927                array(
     928                    'single'  => true,
     929                    'type'    => 'boolean',
     930                    'default' => 123,
     931                ),
     932                true,
     933                '',
     934            ),
     935            array(
     936                array(
     937                    'single'  => false,
     938                    'type'    => 'boolean',
     939                    'default' => 123,
     940                ),
     941                true,
     942                '',
     943            ),
     944            array(
     945                array(
     946                    'single'  => true,
     947                    'type'    => 'boolean',
     948                    'default' => 123,
     949                ),
     950                false,
     951                array(),
     952            ),
     953            array(
     954                array(
     955                    'single'  => false,
     956                    'type'    => 'boolean',
     957                    'default' => 123,
     958                ),
     959                false,
     960                array(),
     961            ),
     962
     963            array(
     964                array(
     965                    'single'  => true,
     966                    'type'    => 'integer',
     967                    'default' => 'wibble',
     968                ),
     969                true,
     970                '',
     971            ),
     972            array(
     973                array(
     974                    'single'  => false,
     975                    'type'    => 'integer',
     976                    'default' => 'wibble',
     977                ),
     978                true,
     979                '',
     980            ),
     981            array(
     982                array(
     983                    'single'  => true,
     984                    'type'    => 'integer',
     985                    'default' => 'wibble',
     986                ),
     987                false,
     988                array(),
     989            ),
     990            array(
     991                array(
     992                    'single'  => false,
     993                    'type'    => 'integer',
     994                    'default' => 'wibble',
     995                ),
     996                false,
     997                array(),
     998            ),
     999            array(
     1000                array(
     1001                    'single'  => false,
     1002                    'type'    => 'integer',
     1003                    'default' => array( 123, 'wibble' ),
     1004                ),
     1005                false,
     1006                array(),
     1007            ),
     1008            array(
     1009                array(
     1010                    'single'  => false,
     1011                    'type'    => 'integer',
     1012                    'default' => array( 123, array() ),
     1013                ),
     1014                false,
     1015                array(),
     1016            ),
     1017            array(
     1018                array(
     1019                    'single'       => false,
     1020                    'type'         => 'array',
     1021                    'show_in_rest' => array(
     1022                        'schema' => array(
     1023                            'type'  => 'array',
     1024                            'items' => array(
     1025                                'type' => 'string',
     1026                            ),
     1027                        ),
     1028                    ),
     1029                    'default'      => array( array( 123, 456 ), array( 'string' ) ),
     1030                ),
     1031                false,
     1032                array(),
     1033            ),
     1034            array(
     1035                array(
     1036                    'single'       => true,
     1037                    'type'         => 'array',
     1038                    'show_in_rest' => array(
     1039                        'schema' => array(
     1040                            'type'  => 'array',
     1041                            'items' => array(
     1042                                'type' => 'string',
     1043                            ),
     1044                        ),
     1045                    ),
     1046                    'default'      => array( array( 123, 456 ), array( 'string' ) ),
     1047                ),
     1048                true,
     1049                '',
     1050            ),
     1051            array(
     1052                array(
     1053                    'show_in_rest' => array(
     1054                        'schema' => array(
     1055                            'type'       => 'object',
     1056                            'properties' => array(
     1057                                'my_prop'          => array(
     1058                                    'type' => 'string',
     1059                                ),
     1060                                'my_required_prop' => array(
     1061                                    'type' => 'string',
     1062                                ),
     1063                            ),
     1064                            'required'   => array( 'my_required_prop' ),
     1065                        ),
     1066                    ),
     1067                    'type'         => 'object',
     1068                    'single'       => true,
     1069                    'default'      => array( 'my_prop' => 'hibble' ),
     1070                ),
     1071                true,
     1072                '',
     1073            ),
     1074        );
    5131075    }
    5141076
Note: See TracChangeset for help on using the changeset viewer.