WordPress.org

Make WordPress Core

Changeset 48402


Ignore:
Timestamp:
07/07/2020 08:45:55 PM (5 weeks 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.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/meta.php

    r48214 r48402  
    211211    // Compare existing value to new value if no prev value given and the key exists only once.
    212212    if ( empty( $prev_value ) ) {
    213         $old_value = get_metadata( $meta_type, $object_id, $meta_key );
    214         if ( count( $old_value ) == 1 ) {
     213        $old_value = get_metadata_raw( $meta_type, $object_id, $meta_key );
     214        if ( is_countable( $old_value ) && count( $old_value ) === 1 ) {
    215215            if ( $old_value[0] === $meta_value ) {
    216216                return false;
     
    486486 * If there's a problem with the parameters passed to the function, boolean `false` is returned.
    487487 *
    488  * @since 2.9.0
     488 * @since 5.5.0
    489489 *
    490490 * @param string $meta_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user',
     
    497497 * @return mixed The metadata value or array of values. See description above for further details.
    498498 */
    499 function get_metadata( $meta_type, $object_id, $meta_key = '', $single = false ) {
     499function get_metadata_raw( $meta_type, $object_id, $meta_key = '', $single = false ) {
    500500    if ( ! $meta_type || ! is_numeric( $object_id ) ) {
    501501        return false;
     
    554554    }
    555555
     556    return null;
     557}
     558
     559/**
     560 * Retrieves raw metadata for the specified object.
     561 *
     562 * @since 2.9.0
     563 * @uses get_metadata_raw()
     564 *
     565 * @param string $meta_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user',
     566 *                          or any other object type with an associated meta table.
     567 * @param int    $object_id ID of the object metadata is for.
     568 * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for
     569 *                          the specified object. Default empty.
     570 * @param bool   $single    Optional. If true, return only the first value of the specified meta_key.
     571 *                          This parameter has no effect if meta_key is not specified. Default false.
     572 * @return mixed Single metadata value, or array of values
     573 */
     574function get_metadata( $meta_type, $object_id, $meta_key = '', $single = false ) {
     575    $value = get_metadata_raw( $meta_type, $object_id, $meta_key, $single );
     576    if ( ! is_null( $value ) ) {
     577        return $value;
     578    }
     579
     580    return get_metadata_default( $meta_type, $meta_key, $single, $object_id );
     581}
     582
     583/**
     584 * Retrieve metadata data default for the specified object.
     585 *
     586 * @since 5.5.0
     587 *
     588 * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     589 * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for
     590 *                          the specified object.
     591 * @param bool   $single    Optional, default is false.
     592 *                          If true, return only the first value of the specified meta_key.
     593 *                          This parameter has no effect if meta_key is not specified.
     594 * @param int    $object_id Optional, default is 0.
     595 *                          ID of the object metadata is for
     596 * @return mixed Single metadata value, or array of values
     597 */
     598function get_metadata_default( $meta_type, $meta_key, $single = false, $object_id = 0 ) {
    556599    if ( $single ) {
    557         return '';
     600        $value = '';
    558601    } else {
    559         return array();
    560     }
     602        $value = array();
     603    }
     604
     605    /**
     606     * Filter the default value a specified object.
     607     *
     608     * @since 5.5.0
     609     *
     610     * @param array|string      $value     The value should return - a single metadata value,
     611     *                                     or an array of values.
     612     * @param string            $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     613     * @param string            $meta_key  Meta key.
     614     * @param bool              $single    Whether to return only the first value of the specified $meta_key.
     615     * @param int               $object_id Object ID.
     616     */
     617    $value = apply_filters( "default_{$meta_type}_metadata", $value, $meta_type, $meta_key, $single, $object_id );
     618
     619    if ( ! $single && ! wp_is_numeric_array( $value ) ) {
     620        $value = array( $value );
     621    }
     622
     623    return $value;
    561624}
    562625
     
    11641227 *     @type string     $description       A description of the data attached to this meta key.
    11651228 *     @type bool       $single            Whether the meta key has one value per object, or an array of values per object.
     1229 *     @type mixed      $default           The default value returned from {@see get_metadata()} if no value has been set yet.
     1230 *                                         When using a non-single meta key, the default value is for the first entry. In other
     1231 *                                         words, when calling {@see get_metadata()} with `$single` set to `false`, the default
     1232 *                                         value given here will be wrapped in an array.
    11661233 *     @type string     $sanitize_callback A function or method to call when sanitizing `$meta_key` data.
    11671234 *     @type string     $auth_callback     Optional. A function or method to call when performing edit_post_meta,
     
    11891256        'type'              => 'string',
    11901257        'description'       => '',
     1258        'default'           => '',
    11911259        'single'            => false,
    11921260        'sanitize_callback' => null,
     
    12261294     */
    12271295    $args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
     1296    unset( $defaults['default'] );
    12281297    $args = wp_parse_args( $args, $defaults );
    12291298
     
    12621331        } else {
    12631332            add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1333        }
     1334    }
     1335
     1336    if ( array_key_exists( 'default', $args ) ) {
     1337        $schema = $args;
     1338        if ( is_array( $args['show_in_rest'] ) && isset( $args['show_in_rest']['schema'] ) ) {
     1339            $schema = array_merge( $schema, $args['show_in_rest']['schema'] );
     1340        }
     1341
     1342        $check = rest_validate_value_from_schema( $args['default'], $schema );
     1343        if ( is_wp_error( $check ) ) {
     1344            _doing_it_wrong( __FUNCTION__, __( 'When registering a default meta value the data must match the type provided.' ), '5.5.0' );
     1345
     1346            return false;
     1347        }
     1348
     1349        if ( ! has_filter( "default_{$object_type}_metadata", 'filter_default_metadata' ) ) {
     1350            add_filter( "default_{$object_type}_metadata", 'filter_default_metadata', 10, 5 );
    12641351        }
    12651352    }
     
    14971584    return apply_filters( "get_object_subtype_{$object_type}", $object_subtype, $object_id );
    14981585}
     1586
     1587/**
     1588 * Filter into default_{$object_type}_metadata and add in default value.
     1589 *
     1590 * @since 5.5.0
     1591 *
     1592 * @param mixed  $value     Current value passed to filter.
     1593 * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     1594
     1595 * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for
     1596 *                          the specified object.
     1597 * @param bool   $single    Optional, default is false.
     1598 *                          If true, return only the first value of the specified meta_key.
     1599 *                          This parameter has no effect if meta_key is not specified.
     1600 * @param int    $object_id ID of the object metadata is for
     1601 *
     1602 * @return mixed Single metadata default, or array of defaults
     1603 */
     1604function filter_default_metadata( $value, $meta_type, $meta_key, $single, $object_id ) {
     1605    global $wp_meta_keys;
     1606
     1607    if ( wp_installing() ) {
     1608        return $value;
     1609    }
     1610
     1611    if ( ! is_array( $wp_meta_keys ) || ! isset( $wp_meta_keys[ $meta_type ] ) ) {
     1612        return $value;
     1613    }
     1614
     1615    $defaults = array();
     1616    foreach ( $wp_meta_keys[ $meta_type ] as $sub_type => $meta_data ) {
     1617        foreach ( $meta_data as $_meta_key => $args ) {
     1618            if ( $_meta_key === $meta_key && array_key_exists( 'default', $args ) ) {
     1619                $defaults[ $sub_type ] = $args;
     1620            }
     1621        }
     1622    }
     1623
     1624    if ( ! $defaults ) {
     1625        return $value;
     1626    }
     1627
     1628    // If this meta type does not have sub types, then the default is keyed as an empty string.
     1629    if ( isset( $defaults[''] ) ) {
     1630        $metadata = $defaults[''];
     1631    } else {
     1632        $sub_type = get_object_subtype( $meta_type, $object_id );
     1633        if ( ! isset( $defaults[ $sub_type ] ) ) {
     1634            return $value;
     1635        }
     1636        $metadata = $defaults[ $sub_type ];
     1637    }
     1638
     1639    if ( $single ) {
     1640        $value = $metadata['default'];
     1641    } else {
     1642        $value = array( $metadata['default'] );
     1643    }
     1644
     1645    return $value;
     1646}
  • trunk/src/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php

    r47943 r48402  
    8080            $name       = $args['name'];
    8181            $all_values = get_metadata( $this->get_meta_type(), $object_id, $meta_key, false );
    82 
    8382            if ( $args['single'] ) {
    8483                if ( empty( $all_values ) ) {
  • 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
  • trunk/tests/phpunit/tests/rest-api/rest-post-meta-fields.php

    r48190 r48402  
    232232                'type'         => 'string',
    233233                'show_in_rest' => true,
     234            )
     235        );
     236
     237        register_post_meta(
     238            'post',
     239            'with_default',
     240            array(
     241                'type'         => 'string',
     242                'single'       => true,
     243                'show_in_rest' => true,
     244                'default'      => 'Goodnight Moon',
    234245            )
    235246        );
     
    27872798
    27882799    /**
     2800     * @ticket 43941
     2801     * @dataProvider data_get_default_data
     2802     */
     2803    public function test_get_default_value( $args, $expected ) {
     2804        $object_type = 'post';
     2805        $meta_key    = 'registered_key1';
     2806        $registered  = register_meta(
     2807            $object_type,
     2808            $meta_key,
     2809            $args
     2810        );
     2811
     2812        $this->assertTrue( $registered );
     2813
     2814        // Check for default value.
     2815        $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
     2816        $response = rest_get_server()->dispatch( $request );
     2817
     2818        $this->assertEquals( 200, $response->get_status() );
     2819
     2820        $data = $response->get_data();
     2821        $this->assertArrayHasKey( 'meta', $data );
     2822
     2823        $meta = (array) $data['meta'];
     2824        $this->assertArrayHasKey( $meta_key, $meta );
     2825        $this->assertEquals( $expected, $meta[ $meta_key ] );
     2826    }
     2827
     2828    public function data_get_default_data() {
     2829        return array(
     2830            array(
     2831                array(
     2832                    'show_in_rest' => true,
     2833                    'single'       => true,
     2834                    'default'      => 'wibble',
     2835                ),
     2836                'wibble',
     2837            ),
     2838            array(
     2839                array(
     2840                    'show_in_rest' => true,
     2841                    'single'       => false,
     2842                    'default'      => 'wibble',
     2843                ),
     2844                array( 'wibble' ),
     2845            ),
     2846            array(
     2847                array(
     2848                    'show_in_rest'   => true,
     2849                    'single'         => true,
     2850                    'object_subtype' => 'post',
     2851                    'default'        => 'wibble',
     2852                ),
     2853                'wibble',
     2854            ),
     2855            array(
     2856                array(
     2857                    'show_in_rest'   => true,
     2858                    'single'         => false,
     2859                    'object_subtype' => 'post',
     2860                    'default'        => 'wibble',
     2861                ),
     2862                array( 'wibble' ),
     2863            ),
     2864            array(
     2865                array(
     2866                    'single'       => true,
     2867                    'show_in_rest' => array(
     2868                        'schema' => array(
     2869                            'type'       => 'object',
     2870                            'properties' => array(
     2871                                'wibble' => array(
     2872                                    'type' => 'string',
     2873                                ),
     2874                            ),
     2875                        ),
     2876                    ),
     2877                    'type'         => 'object',
     2878                    'default'      => array( 'wibble' => 'dibble' ),
     2879                ),
     2880                array( 'wibble' => 'dibble' ),
     2881            ),
     2882            array(
     2883                array(
     2884                    'show_in_rest' => array(
     2885                        'schema' => array(
     2886                            'type'       => 'object',
     2887                            'properties' => array(
     2888                                'wibble' => array(
     2889                                    'type' => 'string',
     2890                                ),
     2891                            ),
     2892                        ),
     2893                    ),
     2894                    'type'         => 'object',
     2895                    'single'       => false,
     2896                    'default'      => array( 'wibble' => 'dibble' ),
     2897                ),
     2898                array( array( 'wibble' => 'dibble' ) ),
     2899            ),
     2900
     2901            array(
     2902                array(
     2903                    'show_in_rest' => array(
     2904                        'schema' => array(
     2905                            'type'  => 'array',
     2906                            'items' => array(
     2907                                'type' => 'string',
     2908                            ),
     2909                        ),
     2910                    ),
     2911                    'single'       => true,
     2912                    'type'         => 'array',
     2913                    'default'      => array( 'dibble' ),
     2914                ),
     2915                array( 'dibble' ),
     2916            ),
     2917            array(
     2918                array(
     2919                    'show_in_rest' => array(
     2920                        'schema' => array(
     2921                            'type'  => 'array',
     2922                            'items' => array(
     2923                                'type' => 'string',
     2924                            ),
     2925                        ),
     2926                    ),
     2927                    'single'       => false,
     2928                    'type'         => 'array',
     2929                    'default'      => array( 'dibble' ),
     2930                ),
     2931                array( array( 'dibble' ) ),
     2932            ),
     2933            'array of objects' => array(
     2934                array(
     2935                    'type'         => 'array',
     2936                    'single'       => true,
     2937                    'show_in_rest' => array(
     2938                        'schema' => array(
     2939                            'type'  => 'array',
     2940                            'items' => array(
     2941                                'type'       => 'object',
     2942                                'properties' => array(
     2943                                    'name' => array(
     2944                                        'type' => 'string',
     2945                                    ),
     2946                                ),
     2947                            ),
     2948                        ),
     2949                    ),
     2950                    'default'      => array(
     2951                        array(
     2952                            'name' => 'Kirk',
     2953                        ),
     2954                    ),
     2955                ),
     2956                array(
     2957                    array(
     2958                        'name' => 'Kirk',
     2959                    ),
     2960                ),
     2961            ),
     2962        );
     2963    }
     2964
     2965    /**
     2966     * @ticket 43941
     2967     */
     2968    public function test_set_default_in_schema() {
     2969        register_post_meta(
     2970            'post',
     2971            'greeting',
     2972            array(
     2973                'type'         => 'string',
     2974                'single'       => true,
     2975                'show_in_rest' => array(
     2976                    'schema' => array(
     2977                        'default' => 'Hello World',
     2978                    ),
     2979                ),
     2980            )
     2981        );
     2982
     2983        $response = rest_do_request( '/wp/v2/posts/' . self::$post_id );
     2984        $this->assertEquals( 'Hello World', $response->get_data()['meta']['greeting'] );
     2985    }
     2986
     2987    /**
     2988     * @ticket 43941
     2989     */
     2990    public function test_default_is_added_to_schema() {
     2991        $request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/posts' );
     2992        $response = rest_do_request( $request );
     2993
     2994        $schema = $response->get_data()['schema']['properties']['meta']['properties']['with_default'];
     2995        $this->assertArrayHasKey( 'default', $schema );
     2996        $this->assertEquals( 'Goodnight Moon', $schema['default'] );
     2997    }
     2998
     2999    /**
    27893000     * Internal function used to disable an insert query which
    27903001     * will trigger a wpdb error for testing purposes.
  • trunk/tests/phpunit/tests/rest-api/rest-term-meta-fields.php

    r46586 r48402  
    12571257
    12581258    /**
     1259     * @ticket 43941
     1260     */
     1261    public function test_get_default_value() {
     1262        $meta_key = 'registered_key1';
     1263        register_term_meta(
     1264            'category',
     1265            $meta_key,
     1266            array(
     1267                'single'       => true,
     1268                'type'         => 'string',
     1269                'default'      => 'Goodbye',
     1270                'show_in_rest' => true,
     1271            )
     1272        );
     1273
     1274        // Check for default value.
     1275        $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/categories/%d', self::$category_id ) );
     1276        $response = rest_get_server()->dispatch( $request );
     1277
     1278        $this->assertEquals( 200, $response->get_status() );
     1279
     1280        $data = $response->get_data();
     1281        $this->assertArrayHasKey( 'meta', $data );
     1282
     1283        $meta = (array) $data['meta'];
     1284        $this->assertArrayHasKey( $meta_key, $meta );
     1285        $this->assertSame( 'Goodbye', $meta[ $meta_key ] );
     1286    }
     1287
     1288    /**
    12591289     * Internal function used to disable an insert query which
    12601290     * will trigger a wpdb error for testing purposes.
  • trunk/tests/phpunit/tests/rest-api/rest-users-controller.php

    r48196 r48402  
    28912891    }
    28922892
     2893    /**
     2894     * @ticket 43941
     2895     * @dataProvider data_get_default_data
     2896     */
     2897    public function test_get_default_value( $args, $expected ) {
     2898        wp_set_current_user( self::$user );
     2899
     2900        $object_type = 'user';
     2901        $meta_key    = 'registered_key1';
     2902        register_meta(
     2903            $object_type,
     2904            $meta_key,
     2905            $args
     2906        );
     2907
     2908        // Check for default value.
     2909        $request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/users/%d', self::$user ) );
     2910        $response = rest_get_server()->dispatch( $request );
     2911
     2912        $this->assertEquals( 200, $response->get_status() );
     2913
     2914        $data = $response->get_data();
     2915        $this->assertArrayHasKey( 'meta', $data );
     2916
     2917        $meta = (array) $data['meta'];
     2918        $this->assertArrayHasKey( $meta_key, $meta );
     2919        $this->assertEquals( $expected, $meta[ $meta_key ] );
     2920    }
     2921
     2922    public function data_get_default_data() {
     2923        return array(
     2924            array(
     2925                array(
     2926                    'show_in_rest' => true,
     2927                    'single'       => true,
     2928                    'default'      => 'wibble',
     2929                ),
     2930                'wibble',
     2931            ),
     2932            array(
     2933                array(
     2934                    'show_in_rest' => true,
     2935                    'single'       => false,
     2936                    'default'      => 'wibble',
     2937                ),
     2938                array( 'wibble' ),
     2939            ),
     2940            array(
     2941                array(
     2942                    'single'       => true,
     2943                    'show_in_rest' => array(
     2944                        'schema' => array(
     2945                            'type'       => 'object',
     2946                            'properties' => array(
     2947                                'wibble' => array(
     2948                                    'type' => 'string',
     2949                                ),
     2950                            ),
     2951                        ),
     2952                    ),
     2953                    'type'         => 'object',
     2954                    'default'      => array( 'wibble' => 'dibble' ),
     2955                ),
     2956                array( 'wibble' => 'dibble' ),
     2957            ),
     2958            array(
     2959                array(
     2960                    'show_in_rest' => array(
     2961                        'schema' => array(
     2962                            'type'       => 'object',
     2963                            'properties' => array(
     2964                                'wibble' => array(
     2965                                    'type' => 'string',
     2966                                ),
     2967                            ),
     2968                        ),
     2969                    ),
     2970                    'type'         => 'object',
     2971                    'single'       => false,
     2972                    'default'      => array( 'wibble' => 'dibble' ),
     2973                ),
     2974                array( array( 'wibble' => 'dibble' ) ),
     2975            ),
     2976
     2977            array(
     2978                array(
     2979                    'show_in_rest' => array(
     2980                        'schema' => array(
     2981                            'type'  => 'array',
     2982                            'items' => array(
     2983                                'type' => 'string',
     2984                            ),
     2985                        ),
     2986                    ),
     2987                    'single'       => true,
     2988                    'type'         => 'array',
     2989                    'default'      => array( 'dibble' ),
     2990                ),
     2991                array( 'dibble' ),
     2992            ),
     2993            array(
     2994                array(
     2995                    'show_in_rest' => array(
     2996                        'schema' => array(
     2997                            'type'  => 'array',
     2998                            'items' => array(
     2999                                'type' => 'string',
     3000                            ),
     3001                        ),
     3002                    ),
     3003                    'single'       => false,
     3004                    'type'         => 'array',
     3005                    'default'      => array( 'dibble' ),
     3006                ),
     3007                array( array( 'dibble' ) ),
     3008            ),
     3009        );
     3010    }
     3011
    28933012    public function additional_field_get_callback( $object ) {
    28943013        return get_user_meta( $object['id'], 'my_custom_int', true );
Note: See TracChangeset for help on using the changeset viewer.