diff --git src/wp-includes/capabilities.php src/wp-includes/capabilities.php
index a19487757c..d2eae061bc 100644
|
|
|
function map_meta_cap( $cap, $user_id, ...$args ) { |
| 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 | } |
diff --git src/wp-includes/class-wp-taxonomy.php src/wp-includes/class-wp-taxonomy.php
index ebc7b0406f..d514ccaca8 100644
|
|
|
final class WP_Taxonomy { |
| 209 | 209 | */ |
| 210 | 210 | public $rest_controller_class; |
| 211 | 211 | |
| | 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 | |
| 212 | 221 | /** |
| 213 | 222 | * The controller instance for this taxonomy's REST API endpoints. |
| 214 | 223 | * |
| … |
… |
final class WP_Taxonomy { |
| 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 | |
| … |
… |
final class WP_Taxonomy { |
| 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( $args['default_term'], array( 'name' => '', 'slug' => '', 'description' => '' ) ); |
| | 405 | } |
| | 406 | |
| 389 | 407 | foreach ( $args as $property_name => $property_value ) { |
| 390 | 408 | $this->$property_name = $property_value; |
| 391 | 409 | } |
diff --git src/wp-includes/post.php src/wp-includes/post.php
index d677b4afe0..65c7b6c15c 100644
|
|
|
function wp_insert_post( $postarr, $wp_error = false ) { |
| 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 ) { |
diff --git src/wp-includes/taxonomy.php src/wp-includes/taxonomy.php
index 707e26359c..a0ae6add61 100644
|
|
|
function is_taxonomy_hierarchical( $taxonomy ) { |
| 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 | * |
| … |
… |
function is_taxonomy_hierarchical( $taxonomy ) { |
| 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 | * } |
| … |
… |
function register_taxonomy( $taxonomy, $object_type, $args = array() ) { |
| 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 | * |
| … |
… |
function wp_set_object_terms( $object_id, $terms, $taxonomy, $append = false ) { |
| 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, |
diff --git tests/phpunit/tests/taxonomy.php tests/phpunit/tests/taxonomy.php
index adf61e76fc..3375331360 100644
|
|
|
class Tests_Taxonomy extends WP_UnitTestCase { |
| 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 | } |