Taxonomy: Improve precision of duplicate name checks when inserting terms.
`wp_insert_term()` does not allow for terms with the same name to exist at the same hierarchy level, unless the second term has a unique slug. When this logic was refactored in [31792] and [34809], a bug was introduced whereby it was possible to bypass the no-same-named-sibling check in cases where the first term had a non-auto-generated slug (ie, where the name was 'Foo' but the slug something other than 'foo', such that the second term would get the non-matching slug 'foo'). This changeset fixes this issue by ensuring that the duplicate name check runs both in cases where there's an actual slug clash *and* in cases where no explicit `slug` has been provided to `wp_insert_term()`. The result is a more reliable error condition: `wp_insert_term( 'Foo' ... )` will always fail if there's a sibling 'Foo', regardless of the sibling's slug. Props mikejolley. See #39984. git-svn-id: https://develop.svn.wordpress.org/trunk@40144 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
parent
242f4e5201
commit
8a2341335b
|
@ -2063,7 +2063,7 @@ function wp_insert_term( $term, $taxonomy, $args = array() ) {
|
||||||
$siblings = get_terms( $taxonomy, array( 'get' => 'all', 'parent' => $parent ) );
|
$siblings = get_terms( $taxonomy, array( 'get' => 'all', 'parent' => $parent ) );
|
||||||
|
|
||||||
$existing_term = null;
|
$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;
|
$existing_term = $name_match;
|
||||||
} elseif ( $slug_match && in_array( $slug, wp_list_pluck( $siblings, 'slug' ) ) ) {
|
} elseif ( $slug_match && in_array( $slug, wp_list_pluck( $siblings, 'slug' ) ) ) {
|
||||||
$existing_term = $slug_match;
|
$existing_term = $slug_match;
|
||||||
|
|
|
@ -376,6 +376,23 @@ class Tests_Term_WpInsertTerm extends WP_UnitTestCase {
|
||||||
$this->assertSame( 'Foo', $t4_term->name );
|
$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
|
* @ticket 31328
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue