Ticket #43517: 43517.diff
File 43517.diff, 6.8 KB (added by , 5 years ago) |
---|
-
src/wp-includes/capabilities.php
539 539 break; 540 540 } 541 541 542 if ( 'delete_term' === $cap && ( get_option( 'default_' . $term->taxonomy ) == $term->term_id ) ) {542 if ( 'delete_term' === $cap && ( get_option( 'default_' . $term->taxonomy ) == $term->term_id || get_option( 'default_taxonomy_' . $term->taxonomy ) == $term->term_id ) ) { 543 543 $caps[] = 'do_not_allow'; 544 544 break; 545 545 } -
src/wp-includes/class-wp-taxonomy.php
210 210 public $rest_controller_class; 211 211 212 212 /** 213 * The default term name for this taxonomy. If you pass an array you have 214 * to set 'name' and optionally 'slug' and 'description'. 215 * 216 * @since 5.5.0 217 * @var array|string 218 */ 219 public $default_term; 220 221 /** 213 222 * The controller instance for this taxonomy's REST API endpoints. 214 223 * 215 224 * Lazily computed. Should be accessed using {@see WP_Taxonomy::get_rest_controller()}. … … 288 297 'show_in_rest' => false, 289 298 'rest_base' => false, 290 299 'rest_controller_class' => false, 300 'default_term' => null, 291 301 '_builtin' => false, 292 302 ); 293 303 … … 386 396 } 387 397 } 388 398 399 // Default taxonomy term. 400 if ( ! empty( $args['default_term'] ) ) { 401 if ( ! is_array( $args['default_term'] ) ) { 402 $args['default_term'] = array( 'name' => $args['default_term'] ); 403 } 404 $args['default_term'] = wp_parse_args( 405 $args['default_term'], 406 array( 407 'name' => '', 408 'slug' => '', 409 'description' => '', 410 ) 411 ); 412 } 413 389 414 foreach ( $args as $property_name => $property_value ) { 390 415 $this->$property_name = $property_value; 391 416 } -
src/wp-includes/post.php
4033 4033 wp_set_post_tags( $post_ID, $postarr['tags_input'] ); 4034 4034 } 4035 4035 4036 // Add default term for all associated custom taxonomies. 4037 if ( 'auto-draft' !== $post_status ) { 4038 foreach ( get_object_taxonomies( $post_type, 'object' ) as $taxonomy => $tax_object ) { 4039 if ( ! empty( $tax_object->default_term ) && ( empty( $postarr['tax_input'] ) || ! isset( $postarr['tax_input'][ $taxonomy ] ) ) ) { 4040 $postarr['tax_input'][ $taxonomy ] = array(); 4041 } 4042 } 4043 } 4044 4036 4045 // New-style support for all custom taxonomies. 4037 4046 if ( ! empty( $postarr['tax_input'] ) ) { 4038 4047 foreach ( $postarr['tax_input'] as $taxonomy => $tags ) { -
src/wp-includes/taxonomy.php
335 335 * arguments to register the Taxonomy in REST API. 336 336 * @since 5.1.0 Introduced `meta_box_sanitize_cb` argument. 337 337 * @since 5.4.0 Added the registered taxonomy object as a return value. 338 * @since 5.5.0 Introduced `default_term` argument. 338 339 * 339 340 * @global array $wp_taxonomies Registered taxonomies. 340 341 * … … 406 407 * to post types, which confirms that the objects are published before 407 408 * counting them. Default _update_generic_term_count() for taxonomies 408 409 * attached to other object types, such as users. 410 * @type string|array $default_term { 411 * Default term to be used for the taxonomy. 412 * 413 * @type string $name Name of default term. 414 * @type string $slug Slug for default term. Default empty. 415 * @type string $description Description for default term. Default empty. 416 * } 409 417 * @type bool $_builtin This taxonomy is a "built-in" taxonomy. INTERNAL USE ONLY! 410 418 * Default false. 411 419 * } … … 432 440 433 441 $taxonomy_object->add_hooks(); 434 442 443 // Add default term. 444 if ( ! empty( $taxonomy_object->default_term ) ) { 445 if ( $term = term_exists( $taxonomy_object->default_term['name'], $taxonomy ) ) { 446 update_option( 'default_taxonomy_' . $taxonomy_object->name, $term['term_id'] ); 447 } else { 448 $term = wp_insert_term( 449 $taxonomy_object->default_term['name'], 450 $taxonomy, 451 array( 452 'slug' => sanitize_title( $taxonomy_object->default_term['slug'] ), 453 'description' => $taxonomy_object->default_term['description'], 454 ) 455 ); 456 457 // Update term id in options. 458 if ( ! is_wp_error( $term ) ) { 459 update_option( 'default_taxonomy_' . $taxonomy_object->name, $term['term_id'] ); 460 } 461 } 462 } 463 435 464 /** 436 465 * Fires after a taxonomy is registered. 437 466 * … … 2482 2511 $terms = array( $terms ); 2483 2512 } 2484 2513 2514 // Add default term. 2515 $taxonomy_obj = get_taxonomy( $taxonomy ); 2516 2517 // Default term for this taxonomy. 2518 if ( empty( $terms ) && ! empty( $taxonomy_obj->default_term ) && ! empty( $default_term_id = get_option( 'default_taxonomy_' . $taxonomy ) ) ) { 2519 $terms[] = (int) $default_term_id; 2520 } 2521 2485 2522 if ( ! $append ) { 2486 2523 $old_tt_ids = wp_get_object_terms( 2487 2524 $object_id, -
tests/phpunit/tests/taxonomy.php
965 965 966 966 $this->assertEquals( $problematic_term, $term_name ); 967 967 } 968 969 /** 970 * Test default term for custom taxonomy. 971 * 972 * @ticket 43517 973 */ 974 function test_default_term_for_custom_taxonomy() { 975 976 wp_set_current_user( self::factory()->user->create( array( 'role' => 'editor' ) ) ); 977 978 $tax = 'custom-tax'; 979 980 // Create custom taxonomy to test with. 981 register_taxonomy( 982 $tax, 983 'post', 984 array( 985 'hierarchical' => true, 986 'public' => true, 987 'default_term' => array( 988 'name' => 'Default category', 989 'slug' => 'default-category', 990 ), 991 ) 992 ); 993 994 // Add post. 995 $post_id = wp_insert_post( 996 array( 997 'post_title' => 'Foo', 998 'post_type' => 'post', 999 ) 1000 ); 1001 1002 $term = wp_get_post_terms( $post_id, $tax ); 1003 $this->assertSame( get_option( 'default_taxonomy_' . $tax ), $term[0]->term_id ); 1004 1005 // Add custom post type. 1006 register_post_type( 1007 'post-custom-tax', 1008 array( 1009 'taxonomies' => array( $tax ), 1010 ) 1011 ); 1012 $post_id = wp_insert_post( 1013 array( 1014 'post_title' => 'Foo', 1015 'post_type' => 'post-custom-tax', 1016 ) 1017 ); 1018 $term = wp_get_post_terms( $post_id, $tax ); 1019 $this->assertSame( get_option( 'default_taxonomy_' . $tax ), $term[0]->term_id ); 1020 } 968 1021 }