diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index 9a3a13cb29..1c63b9be03 100644 --- a/src/wp-includes/taxonomy.php +++ b/src/wp-includes/taxonomy.php @@ -2063,7 +2063,7 @@ function wp_insert_term( $term, $taxonomy, $args = array() ) { $siblings = get_terms( $taxonomy, array( 'get' => 'all', 'parent' => $parent ) ); $existing_term = null; - if ( $name_match->slug === $slug && in_array( $name, wp_list_pluck( $siblings, 'name' ) ) ) { + if ( ( ! $slug_provided || $name_match->slug === $slug ) && in_array( $name, wp_list_pluck( $siblings, 'name' ) ) ) { $existing_term = $name_match; } elseif ( $slug_match && in_array( $slug, wp_list_pluck( $siblings, 'slug' ) ) ) { $existing_term = $slug_match; diff --git a/tests/phpunit/tests/term/wpInsertTerm.php b/tests/phpunit/tests/term/wpInsertTerm.php index 6ec7ee9864..21b6cd79e8 100644 --- a/tests/phpunit/tests/term/wpInsertTerm.php +++ b/tests/phpunit/tests/term/wpInsertTerm.php @@ -376,6 +376,23 @@ class Tests_Term_WpInsertTerm extends WP_UnitTestCase { $this->assertSame( 'Foo', $t4_term->name ); } + /** + * @ticket 39984 + */ + public function test_duplicate_name_check_should_fail_when_no_slug_is_provided_even_when_slugs_would_not_clash() { + register_taxonomy( 'wptests_tax', 'post', array( 'hierarchical' => true ) ); + $t1 = self::factory()->term->create( array( + 'name' => 'Foo', + 'slug' => 'foo-no-conflict', + 'taxonomy' => 'wptests_tax', + ) ); + + $error = wp_insert_term( 'Foo', 'wptests_tax' ); + + $this->assertWPError( $error ); + $this->assertSame( 'term_exists', $error->get_error_code() ); + $this->assertSame( $t1, $error->get_error_data() ); + } /** * @ticket 31328 */