WordPress.org

Make WordPress Core

Ticket #43941: 43941.4.diff

File 43941.4.diff, 10.5 KB (added by spacedmonkey, 5 weeks ago)
  • src/wp-includes/meta.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    7575        }
    7676
    7777        if ( $unique && $wpdb->get_var(
    78                 $wpdb->prepare(
    79                         "SELECT COUNT(*) FROM $table WHERE meta_key = %s AND $column = %d",
    80                         $meta_key,
    81                         $object_id
    82                 )
    83         ) ) {
     78                        $wpdb->prepare(
     79                                "SELECT COUNT(*) FROM $table WHERE meta_key = %s AND $column = %d",
     80                                $meta_key,
     81                                $object_id
     82                        )
     83                ) ) {
    8484                return false;
    8585        }
    8686
     
    206206
    207207        // Compare existing value to new value if no prev value given and the key exists only once.
    208208        if ( empty( $prev_value ) ) {
     209                remove_filter( "default_{$meta_type}_metadata", "filter_default_metadata", 10, 5 );
    209210                $old_value = get_metadata( $meta_type, $object_id, $meta_key );
     211                add_filter( "default_{$meta_type}_metadata", "filter_default_metadata", 10, 5 );
    210212                if ( count( $old_value ) == 1 ) {
    211213                        if ( $old_value[0] === $meta_value ) {
    212214                                return false;
     
    542544                }
    543545        }
    544546
     547        return get_metadata_default( $meta_type, $meta_key, $single, $object_id );
     548}
     549
     550/**
     551 * Retrieve metadata data default for the specified object.
     552 *
     553 * @since 5.3.0
     554 *
     555 * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     556 * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for
     557 *                          the specified object.
     558 * @param bool   $single    Optional, default is false.
     559 *                          If true, return only the first value of the specified meta_key.
     560 *                          This parameter has no effect if meta_key is not specified.
     561 * @param int    $object_id Optional, default is 0.
     562 *                          ID of the object metadata is for
     563 * @return mixed Single metadata value, or array of values
     564 */
     565function get_metadata_default( $meta_type, $meta_key, $single = false, $object_id = 0 ) {
    545566        if ( $single ) {
    546                 return '';
     567                $value = '';
    547568        } else {
    548                 return array();
     569                $value = array();
    549570        }
     571
     572        /**
     573         * Filter the default value a specified object.
     574         *
     575         * @since 5.3.0
     576         *
     577         * @param array|string      $value     The value should return - a single metadata value,
     578         *                                     or an array of values.
     579         * @param string            $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     580         * @param string            $meta_key  Meta key.
     581         * @param bool              $single    Whether to return only the first value of the specified $meta_key.
     582         * @param int               $object_id Object ID.
     583         */
     584        $value = apply_filters( "default_{$meta_type}_metadata", $value, $meta_type, $meta_key, $single, $object_id );
     585
     586        return $value;
    550587}
    551588
    552589/**
     
    11511188                'type'              => 'string',
    11521189                'description'       => '',
    11531190                'single'            => false,
     1191                'default'           => null,
    11541192                'sanitize_callback' => null,
    11551193                'auth_callback'     => null,
    11561194                'show_in_rest'      => false,
     
    12161254                }
    12171255        }
    12181256
     1257        if ( false === $args['single'] && ! wp_is_numeric_array( $args['default'] ) ) {
     1258                $args['default'] = null;
     1259        }
     1260
     1261        if ( null !== $args['default'] ) {
     1262                add_filter( "default_{$object_type}_metadata", "filter_default_metadata", 10, 5 );
     1263        }
     1264
    12191265        // Global registry only contains meta keys registered with the array of arguments added in 4.6.0.
    12201266        if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb ) {
    12211267                unset( $args['object_subtype'] );
     
    14441490         */
    14451491        return apply_filters( "get_object_subtype_{$object_type}", $object_subtype, $object_id );
    14461492}
     1493
     1494/**
     1495 * Filter into default_{$object_type}_metadata and add in default value.
     1496 *
     1497 * @since 5.3.0
     1498 *
     1499 * @param mixed  $value     Current value passed to filter.
     1500 * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user).
     1501
     1502 * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for
     1503 *                          the specified object.
     1504 * @param bool   $single    Optional, default is false.
     1505 *                          If true, return only the first value of the specified meta_key.
     1506 *                          This parameter has no effect if meta_key is not specified.
     1507 * @param int    $object_id ID of the object metadata is for
     1508 *
     1509 * @return mixed Single metadata default, or array of defaults
     1510 */
     1511function filter_default_metadata( $value, $meta_type, $meta_key, $single, $object_id ) {
     1512        $metadata = get_registered_meta_keys( $meta_type );
     1513        if ( ! isset( $metadata[ $meta_key ] ) ) {
     1514                $sub_type = get_object_subtype( $meta_type, $object_id );
     1515                $metadata = get_registered_meta_keys( $meta_type, $sub_type );
     1516                if ( ! isset( $metadata[ $meta_key ] ) ) {
     1517                        return $value;
     1518                }
     1519        }
     1520
     1521        if ( $single ) {
     1522                if ( $metadata[ $meta_key ]['single'] ) {
     1523                        $value = $metadata[ $meta_key ]['default'];
     1524                } else {
     1525                        $value = $metadata[ $meta_key ]['default'][0];
     1526                }
     1527        } else {
     1528                $value = $metadata[ $meta_key ]['default'];
     1529        }
     1530
     1531        return $value;
     1532}
  • tests/phpunit/tests/meta/registerMeta.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    9595                                                'description'       => '',
    9696                                                'single'            => false,
    9797                                                'sanitize_callback' => null,
     98                                                'default'           => null,
    9899                                                'auth_callback'     => '__return_true',
    99100                                                'show_in_rest'      => false,
    100101                                        ),
     
    119120                                                'description'       => '',
    120121                                                'single'            => false,
    121122                                                'sanitize_callback' => null,
     123                                                'default'           => null,
    122124                                                'auth_callback'     => '__return_true',
    123125                                                'show_in_rest'      => false,
    124126                                        ),
     
    172174                                                'type'              => 'string',
    173175                                                'description'       => '',
    174176                                                'single'            => false,
     177                                                'default'           => null,
    175178                                                'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ),
    176179                                                'auth_callback'     => '__return_true',
    177180                                                'show_in_rest'      => false,
     
    340343                                                'description'       => '',
    341344                                                'single'            => false,
    342345                                                'sanitize_callback' => null,
     346                                                'default'           => null,
    343347                                                'auth_callback'     => '__return_true',
    344348                                                'show_in_rest'      => false,
    345349                                        ),
     
    393397                                                'description'       => '',
    394398                                                'single'            => false,
    395399                                                'sanitize_callback' => null,
     400                                                'default'           => null,
    396401                                                'auth_callback'     => '__return_true',
    397402                                                'show_in_rest'      => false,
    398403                                        ),
     
    504509                $this->assertSame( 'even', $subtype_for_4 );
    505510        }
    506511
     512        /**
     513         * @ticket 43941
     514         * @dataProvider data_get_default_data
     515         */
     516        public function test_get_default_value( $args, $single, $expected ) {
     517
     518                $object_type = 'post';
     519                $meta_key =     'registered_key1';
     520                register_meta(
     521                        $object_type,
     522                        $meta_key,
     523                        $args
     524                );
     525
     526                $object_property_name = $object_type . '_id';
     527                $object_id            = self::$$object_property_name;
     528
     529                // Check for default value.
     530                $value = get_metadata( $object_type, $object_id, $meta_key, $single );
     531                $this->assertSame( $value, $expected );
     532
     533                // Set value to check default is not being returned by mistake.
     534                $meta_value = 'dibble';
     535                update_metadata( $object_type, $object_id, $meta_key, $meta_value);
     536                $value = get_metadata( $object_type, $object_id, $meta_key, true );
     537                $this->assertSame( $value, $meta_value );
     538
     539                // Delete meta, make sure the default is returned.
     540                delete_metadata( $object_type, $object_id, $meta_key);
     541                $value = get_metadata( $object_type, $object_id, $meta_key, $single );
     542                $this->assertSame( $value, $expected );
     543
     544                // Set other meta key, to make sure other keys are not effects.
     545                $meta_value = 'hibble';
     546                $meta_key = 'unregistered_key1';
     547                $value = get_metadata( $object_type, $object_id, $meta_key, true );
     548                $this->assertSame( $value, '' );
     549                update_metadata( $object_type, $object_id, $meta_key, $meta_value);
     550                $value = get_metadata( $object_type, $object_id, $meta_key, true );
     551                $this->assertSame( $value, $meta_value );
     552
     553        }
     554
    507555        public function filter_get_object_subtype_for_customtype( $subtype, $object_id ) {
    508556                if ( 1 === ( $object_id % 2 ) ) {
    509557                        return 'odd';
     
    512560                return 'even';
    513561        }
    514562
     563        public function data_get_default_data() {
     564                return array(
     565                        array(
     566                                array( 'single' => true, 'default' => 'wibble' ),
     567                                true,
     568                                'wibble'
     569                        ),
     570                        array(
     571                                array( 'single' => true, 'default' => 'wibble' ),
     572                                false,
     573                                array( 'wibble' )
     574                        ),
     575                        array(
     576                                array( 'single' => true, 'default' => array( 'wibble' ) ),
     577                                true,
     578                                array( 'wibble' )
     579                        ),
     580                        array(
     581                                array( 'single' => true, 'default' => array( 'wibble' ) ),
     582                                false,
     583                                array( array( 'wibble' ) )
     584                        ),
     585                        array(
     586                                array( 'single' => false, 'default' => 'wibble' ),
     587                                true,
     588                                ''
     589                        ),
     590                        array(
     591                                array( 'single' => false, 'default' => 'wibble' ),
     592                                false,
     593                                array()
     594                        ),
     595                        array(
     596                                array( 'single' => false, 'default' => array( 'wibble' ) ),
     597                                true,
     598                                'wibble'
     599                        ),
     600                        array(
     601                                array( 'single' => false, 'default' => array( 'wibble' ) ),
     602                                false,
     603                                array( 'wibble' )
     604                        ),
     605                        array(
     606                                array( 'single' => true, 'object_subtype'=> 'page', 'default' => 'wibble' ),
     607                                true,
     608                                'wibble'
     609                        ),
     610                        array(
     611                                array( 'single' => true, 'object_subtype'=> 'page', 'default' => 'wibble' ),
     612                                false,
     613                                array( 'wibble' )
     614                        ),
     615                        array(
     616                                array( 'single' => true, 'object_subtype'=> 'page', 'default' => array( 'wibble' ) ),
     617                                true,
     618                                array( 'wibble' )
     619                        ),
     620                        array(
     621                                array( 'single' => true, 'object_subtype'=> 'page', 'default' => array( 'wibble' ) ),
     622                                false,
     623                                array( array( 'wibble' ) )
     624                        ),
     625                        array(
     626                                array( 'single' => true, 'object_subtype'=> 'post', 'default' => 'wibble' ),
     627                                true,
     628                                ''
     629                        ),
     630                        array(
     631                                array( 'single' => true, 'object_subtype'=> 'post', 'default' => 'wibble' ),
     632                                false,
     633                                array()
     634                        ),
     635                        array(
     636                                array( 'single' => true, 'object_subtype'=> 'post', 'default' => array( 'wibble' ) ),
     637                                true,
     638                                ''
     639                        ),
     640                        array(
     641                                array( 'single' => true, 'object_subtype'=> 'post', 'default' => array( 'wibble' ) ),
     642                                false,
     643                                array()
     644                        ),
     645                );
     646        }
     647
    515648        public function data_get_types_and_subtypes() {
    516649                return array(
    517650                        array( 'post', 'page' ),