Ticket #43941: 43941.5.diff
File 43941.5.diff, 10.8 KB (added by , 5 years ago) |
---|
-
src/wp-includes/meta.php
diff --git a/src/wp-includes/meta.php b/src/wp-includes/meta.php index 3966a23469..893eb66e36 100644
a b function add_metadata( $meta_type, $object_id, $meta_key, $meta_value, $unique = 75 75 } 76 76 77 77 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_id82 )83 ) ) {78 $wpdb->prepare( 79 "SELECT COUNT(*) FROM $table WHERE meta_key = %s AND $column = %d", 80 $meta_key, 81 $object_id 82 ) 83 ) ) { 84 84 return false; 85 85 } 86 86 … … function update_metadata( $meta_type, $object_id, $meta_key, $meta_value, $prev_ 206 206 207 207 // Compare existing value to new value if no prev value given and the key exists only once. 208 208 if ( empty( $prev_value ) ) { 209 remove_filter( "default_{$meta_type}_metadata", "filter_default_metadata", 10, 5 ); 209 210 $old_value = get_metadata( $meta_type, $object_id, $meta_key ); 211 add_filter( "default_{$meta_type}_metadata", "filter_default_metadata", 10, 5 ); 210 212 if ( count( $old_value ) == 1 ) { 211 213 if ( $old_value[0] === $meta_value ) { 212 214 return false; … … function get_metadata( $meta_type, $object_id, $meta_key = '', $single = false ) 542 544 } 543 545 } 544 546 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 */ 565 function get_metadata_default( $meta_type, $meta_key, $single = false, $object_id = 0 ) { 545 566 if ( $single ) { 546 return'';567 $value = ''; 547 568 } else { 548 returnarray();569 $value = array(); 549 570 } 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; 550 587 } 551 588 552 589 /** … … function register_meta( $object_type, $meta_key, $args, $deprecated = null ) { 1216 1253 } 1217 1254 } 1218 1255 1256 if ( false === $args['single'] && ! wp_is_numeric_array( $args['default'] ) ) { 1257 unset( $args['default'] ); 1258 } 1259 1260 if ( array_key_exists( 'default', $args ) ) { 1261 add_filter( "default_{$object_type}_metadata", 'filter_default_metadata', 10, 5 ); 1262 } 1263 1219 1264 // Global registry only contains meta keys registered with the array of arguments added in 4.6.0. 1220 1265 if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb ) { 1221 1266 unset( $args['object_subtype'] ); … … function get_object_subtype( $object_type, $object_id ) { 1444 1489 */ 1445 1490 return apply_filters( "get_object_subtype_{$object_type}", $object_subtype, $object_id ); 1446 1491 } 1492 1493 /** 1494 * Filter into default_{$object_type}_metadata and add in default value. 1495 * 1496 * @since 5.3.0 1497 * 1498 * @param mixed $value Current value passed to filter. 1499 * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user). 1500 1501 * @param string $meta_key Optional. Metadata key. If not specified, retrieve all metadata for 1502 * the specified object. 1503 * @param bool $single Optional, default is false. 1504 * If true, return only the first value of the specified meta_key. 1505 * This parameter has no effect if meta_key is not specified. 1506 * @param int $object_id ID of the object metadata is for 1507 * 1508 * @return mixed Single metadata default, or array of defaults 1509 */ 1510 function filter_default_metadata( $value, $meta_type, $meta_key, $single, $object_id ) { 1511 $metadata = get_registered_meta_keys( $meta_type ); 1512 if ( ! isset( $metadata[ $meta_key ] ) ) { 1513 $sub_type = get_object_subtype( $meta_type, $object_id ); 1514 $metadata = get_registered_meta_keys( $meta_type, $sub_type ); 1515 if ( ! isset( $metadata[ $meta_key ] ) ) { 1516 return $value; 1517 } 1518 } 1519 1520 if ( $single ) { 1521 if ( $metadata[ $meta_key ]['single'] ) { 1522 $value = $metadata[ $meta_key ]['default']; 1523 } else { 1524 $value = $metadata[ $meta_key ]['default'][0]; 1525 } 1526 } else { 1527 $value = $metadata[ $meta_key ]['default']; 1528 } 1529 1530 return $value; 1531 } -
tests/phpunit/tests/meta/registerMeta.php
diff --git a/tests/phpunit/tests/meta/registerMeta.php b/tests/phpunit/tests/meta/registerMeta.php index 334a2320d0..e9352fb1e1 100644
a b class Tests_Meta_Register_Meta extends WP_UnitTestCase { 95 95 'description' => '', 96 96 'single' => false, 97 97 'sanitize_callback' => null, 98 'default' => null, 98 99 'auth_callback' => '__return_true', 99 100 'show_in_rest' => false, 100 101 ), … … class Tests_Meta_Register_Meta extends WP_UnitTestCase { 119 120 'description' => '', 120 121 'single' => false, 121 122 'sanitize_callback' => null, 123 'default' => null, 122 124 'auth_callback' => '__return_true', 123 125 'show_in_rest' => false, 124 126 ), … … class Tests_Meta_Register_Meta extends WP_UnitTestCase { 172 174 'type' => 'string', 173 175 'description' => '', 174 176 'single' => false, 177 'default' => null, 175 178 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ), 176 179 'auth_callback' => '__return_true', 177 180 'show_in_rest' => false, … … class Tests_Meta_Register_Meta extends WP_UnitTestCase { 340 343 'description' => '', 341 344 'single' => false, 342 345 'sanitize_callback' => null, 346 'default' => null, 343 347 'auth_callback' => '__return_true', 344 348 'show_in_rest' => false, 345 349 ), … … class Tests_Meta_Register_Meta extends WP_UnitTestCase { 393 397 'description' => '', 394 398 'single' => false, 395 399 'sanitize_callback' => null, 400 'default' => null, 396 401 'auth_callback' => '__return_true', 397 402 'show_in_rest' => false, 398 403 ), … … class Tests_Meta_Register_Meta extends WP_UnitTestCase { 504 509 $this->assertSame( 'even', $subtype_for_4 ); 505 510 } 506 511 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 507 555 public function filter_get_object_subtype_for_customtype( $subtype, $object_id ) { 508 556 if ( 1 === ( $object_id % 2 ) ) { 509 557 return 'odd'; … … class Tests_Meta_Register_Meta extends WP_UnitTestCase { 512 560 return 'even'; 513 561 } 514 562 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 515 648 public function data_get_types_and_subtypes() { 516 649 return array( 517 650 array( 'post', 'page' ),