Make WordPress Core

Ticket #43941: 43941.15.diff

File 43941.15.diff, 13.6 KB (added by spacedmonkey, 5 years ago)
  • src/wp-includes/meta.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    205205
    206206        // Compare existing value to new value if no prev value given and the key exists only once.
    207207        if ( empty( $prev_value ) ) {
    208                 $old_value = get_metadata( $meta_type, $object_id, $meta_key );
    209                 if ( count( $old_value ) == 1 ) {
     208                $old_value = get_metadata_raw( $meta_type, $object_id, $meta_key );
     209                if ( is_countable( $old_value ) && count( $old_value ) == 1 ) {
    210210                        if ( $old_value[0] === $meta_value ) {
    211211                                return false;
    212212                        }
     
    473473}
    474474
    475475/**
    476  * Retrieves metadata for the specified object.
     476 * Retrieves raw metadata for the specified object.
    477477 *
    478  * @since 2.9.0
     478 * @since 5.5.0
    479479 *
    480480 * @param string $meta_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user',
    481481 *                          or any other object type with an associated meta table.
     
    486486 *                          This parameter has no effect if meta_key is not specified. Default false.
    487487 * @return mixed Single metadata value, or array of values
    488488 */
    489 function get_metadata( $meta_type, $object_id, $meta_key = '', $single = false ) {
     489function get_metadata_raw( $meta_type, $object_id, $meta_key = '', $single = false ) {
    490490        if ( ! $meta_type || ! is_numeric( $object_id ) ) {
    491491                return false;
    492492        }
     
    543543                }
    544544        }
    545545
     546        return null;
     547}
     548
     549/**
     550 * Retrieves raw metadata for the specified object.
     551 *
     552 * @since 2.9.0
     553 * @uses get_metadata_raw()
     554 *
     555 * @param string $meta_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user',
     556 *                          or any other object type with an associated meta table.
     557 * @param int    $object_id ID of the object metadata is for.
     558 * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for
     559 *                          the specified object. Default empty.
     560 * @param bool   $single    Optional. If true, return only the first value of the specified meta_key.
     561 *                          This parameter has no effect if meta_key is not specified. Default false.
     562 * @return mixed Single metadata value, or array of values
     563 */
     564function get_metadata( $meta_type, $object_id, $meta_key = '', $single = false ) {
     565        $value = get_metadata_raw( $meta_type, $object_id, $meta_key, $single );
     566        if ( ! is_null( $value ) ) {
     567                return $value;
     568        }
     569
     570        return get_metadata_default( $meta_type, $meta_key, $single, $object_id );
     571}
     572
     573/**
     574 * Retrieve metadata data default for the specified object.
     575 *
     576 * @since 5.5.0
     577 *
     578 * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     579 * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for
     580 *                          the specified object.
     581 * @param bool   $single    Optional, default is false.
     582 *                          If true, return only the first value of the specified meta_key.
     583 *                          This parameter has no effect if meta_key is not specified.
     584 * @param int    $object_id Optional, default is 0.
     585 *                          ID of the object metadata is for
     586 * @return mixed Single metadata value, or array of values
     587 */
     588function get_metadata_default( $meta_type, $meta_key, $single = false, $object_id = 0 ) {
    546589        if ( $single ) {
    547                 return '';
     590                $value = '';
    548591        } else {
    549                 return array();
     592                $value = array();
    550593        }
     594
     595        /**
     596         * Filter the default value a specified object.
     597         *
     598         * @since 5.5.0
     599         *
     600         * @param array|string      $value     The value should return - a single metadata value,
     601         *                                     or an array of values.
     602         * @param string            $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     603         * @param string            $meta_key  Meta key.
     604         * @param bool              $single    Whether to return only the first value of the specified $meta_key.
     605         * @param int               $object_id Object ID.
     606         */
     607        $value = apply_filters( "default_{$meta_type}_metadata", $value, $meta_type, $meta_key, $single, $object_id );
     608
     609        if ( ! $single && ! wp_is_numeric_array( $value ) ) {
     610                $value = array( $value );
     611        }
     612
     613        return $value;
    551614}
    552615
    553616/**
     
    11391202 *     @type string     $type              The type of data associated with this meta key.
    11401203 *                                         Valid values are 'string', 'boolean', 'integer', 'number', 'array', and 'object'.
    11411204 *     @type string     $description       A description of the data attached to this meta key.
     1205 *     @type mixed      $default           Default value when calling `get_metadata()`.
    11421206 *     @type bool       $single            Whether the meta key has one value per object, or an array of values per object.
    11431207 *     @type string     $sanitize_callback A function or method to call when sanitizing `$meta_key` data.
    11441208 *     @type string     $auth_callback     Optional. A function or method to call when performing edit_post_meta,
     
    11651229                'object_subtype'    => '',
    11661230                'type'              => 'string',
    11671231                'description'       => '',
     1232                'default'           => '',
    11681233                'single'            => false,
    11691234                'sanitize_callback' => null,
    11701235                'auth_callback'     => null,
     
    12021267         * @param string $meta_key    Meta key.
    12031268         */
    12041269        $args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
     1270        unset( $defaults['default'] );
    12051271        $args = wp_parse_args( $args, $defaults );
    12061272
    12071273        // Require an item schema when registering array meta.
     
    12411307                }
    12421308        }
    12431309
     1310        if ( array_key_exists( 'default', $args ) ) {
     1311                if ( false === $args['single'] && ! wp_is_numeric_array( $args['default'] ) ) {
     1312                        $args['default'] = array( $args['default'] );
     1313                }
     1314                if ( ! has_filter( "default_{$object_type}_metadata", 'filter_default_metadata' ) ) {
     1315                        add_filter( "default_{$object_type}_metadata", 'filter_default_metadata', 10, 5 );
     1316                }
     1317        }
     1318
    12441319        // Global registry only contains meta keys registered with the array of arguments added in 4.6.0.
    12451320        if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb ) {
    12461321                unset( $args['object_subtype'] );
     
    14731548         */
    14741549        return apply_filters( "get_object_subtype_{$object_type}", $object_subtype, $object_id );
    14751550}
     1551
     1552/**
     1553 * Filter into default_{$object_type}_metadata and add in default value.
     1554 *
     1555 * @since 5.5.0
     1556 *
     1557 * @param mixed  $value     Current value passed to filter.
     1558 * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     1559
     1560 * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for
     1561 *                          the specified object.
     1562 * @param bool   $single    Optional, default is false.
     1563 *                          If true, return only the first value of the specified meta_key.
     1564 *                          This parameter has no effect if meta_key is not specified.
     1565 * @param int    $object_id ID of the object metadata is for
     1566 *
     1567 * @return mixed Single metadata default, or array of defaults
     1568 */
     1569function filter_default_metadata( $value, $meta_type, $meta_key, $single, $object_id ) {
     1570        global $wp_meta_keys;
     1571
     1572        if ( wp_installing() ) {
     1573                return $value;
     1574        }
     1575
     1576        if ( ! is_array( $wp_meta_keys ) || ! isset( $wp_meta_keys[ $meta_type ] ) ) {
     1577                return $value;
     1578        }
     1579
     1580        $defaults = array();
     1581        foreach ( $wp_meta_keys[ $meta_type ] as $sub_type => $meta_data ) {
     1582                foreach ( $meta_data as $_meta_key => $args ) {
     1583                        if ( $_meta_key === $meta_key && isset( $args['default'] ) ) {
     1584                                $defaults[ $sub_type ] = $args;
     1585                        }
     1586                }
     1587        }
     1588
     1589        if ( ! $defaults ) {
     1590                return $value;
     1591        }
     1592
     1593        if ( isset( $defaults[''] ) ) {
     1594                $metadata = $defaults[''];
     1595        } else {
     1596                $sub_type = get_object_subtype( $meta_type, $object_id );
     1597                if ( ! isset( $defaults[ $sub_type ] ) ) {
     1598                        return $value;
     1599                }
     1600                $metadata = $defaults[ $sub_type ];
     1601        }
     1602
     1603        if ( $single ) {
     1604                if ( $metadata['single'] ) {
     1605                        $value = $metadata['default'];
     1606                } else {
     1607                        $value = $metadata['default'][0];
     1608                }
     1609        } else {
     1610                $value = $metadata['default'];
     1611        }
     1612
     1613        return $value;
     1614}
  • tests/phpunit/tests/meta/registerMeta.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    504504                $this->assertSame( 'even', $subtype_for_4 );
    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
    507552        public function filter_get_object_subtype_for_customtype( $subtype, $object_id ) {
    508553                if ( 1 === ( $object_id % 2 ) ) {
    509554                        return 'odd';
     
    512557                return 'even';
    513558        }
    514559
     560        public function data_get_default_data() {
     561                return array(
     562                        array(
     563                                array(
     564                                        'single'  => true,
     565                                        'default' => 'wibble',
     566                                ),
     567                                true,
     568                                'wibble',
     569                        ),
     570                        array(
     571                                array(
     572                                        'single'  => true,
     573                                        'default' => 'wibble',
     574                                ),
     575                                false,
     576                                array( 'wibble' ),
     577                        ),
     578                        array(
     579                                array(
     580                                        'single'  => true,
     581                                        'default' => array( 'wibble' ),
     582                                ),
     583                                true,
     584                                array( 'wibble' ),
     585                        ),
     586                        array(
     587                                array(
     588                                        'single'  => true,
     589                                        'default' => array( 'wibble' ),
     590                                ),
     591                                false,
     592                                array( 'wibble' ),
     593                        ),
     594                        array(
     595                                array(
     596                                        'single'  => false,
     597                                        'default' => 'wibble',
     598                                ),
     599                                true,
     600                                'wibble',
     601                        ),
     602                        array(
     603                                array(
     604                                        'single'  => false,
     605                                        'default' => 'wibble',
     606                                ),
     607                                false,
     608                                array( 'wibble' ),
     609                        ),
     610                        array(
     611                                array(
     612                                        'single'  => false,
     613                                        'default' => array( 'wibble' ),
     614                                ),
     615                                true,
     616                                'wibble',
     617                        ),
     618                        array(
     619                                array(
     620                                        'single'  => false,
     621                                        'default' => array( 'wibble' ),
     622                                ),
     623                                false,
     624                                array( 'wibble' ),
     625                        ),
     626                        array(
     627                                array(
     628                                        'single'         => true,
     629                                        'object_subtype' => 'page',
     630                                        'default'        => 'wibble',
     631                                ),
     632                                true,
     633                                'wibble',
     634                        ),
     635                        array(
     636                                array(
     637                                        'single'         => true,
     638                                        'object_subtype' => 'page',
     639                                        'default'        => 'wibble',
     640                                ),
     641                                false,
     642                                array( 'wibble' ),
     643                        ),
     644                        array(
     645                                array(
     646                                        'single'         => true,
     647                                        'object_subtype' => 'page',
     648                                        'default'        => array( 'wibble' ),
     649                                ),
     650                                true,
     651                                array( 'wibble' ),
     652                        ),
     653                        array(
     654                                array(
     655                                        'single'         => true,
     656                                        'object_subtype' => 'page',
     657                                        'default'        => array( 'wibble' ),
     658                                ),
     659                                false,
     660                                array( 'wibble' ),
     661                        ),
     662                        array(
     663                                array(
     664                                        'single'         => true,
     665                                        'object_subtype' => 'post',
     666                                        'default'        => 'wibble',
     667                                ),
     668                                true,
     669                                '',
     670                        ),
     671                        array(
     672                                array(
     673                                        'single'         => true,
     674                                        'object_subtype' => 'post',
     675                                        'default'        => 'wibble',
     676                                ),
     677                                false,
     678                                array(),
     679                        ),
     680                        array(
     681                                array(
     682                                        'single'         => true,
     683                                        'object_subtype' => 'post',
     684                                        'default'        => array( 'wibble' ),
     685                                ),
     686                                true,
     687                                '',
     688                        ),
     689                        array(
     690                                array(
     691                                        'single'         => true,
     692                                        'object_subtype' => 'post',
     693                                        'default'        => array( 'wibble' ),
     694                                ),
     695                                false,
     696                                array(),
     697                        ),
     698                        array(
     699                                array(
     700                                        'single'  => true,
     701                                        'default' => array( 'wibble' => 'dibble' ),
     702                                ),
     703                                true,
     704                                array( 'wibble' => 'dibble' ),
     705                        ),
     706                        array(
     707                                array(
     708                                        'single'  => true,
     709                                        'default' => array( 'wibble' => 'dibble' ),
     710                                ),
     711                                false,
     712                                array(
     713                                        array( 'wibble' => 'dibble' ),
     714                                ),
     715                        ),
     716                        array(
     717                                array(
     718                                        'single'  => false,
     719                                        'default' => array( 'wibble' => 'dibble' ),
     720                                ),
     721                                true,
     722                                array( 'wibble' => 'dibble' ),
     723                        ),
     724                        array(
     725                                array(
     726                                        'single'  => false,
     727                                        'default' => array( 'wibble' => 'dibble' ),
     728                                ),
     729                                false,
     730                                array(
     731                                        array( 'wibble' => 'dibble' ),
     732                                ),
     733                        ),
     734                );
     735        }
     736
    515737        public function data_get_types_and_subtypes() {
    516738                return array(
    517739                        array( 'post', 'page' ),