In `wp_insert_term()`, allow a term with an existing name if a unique `$slug` has been provided.
`wp_insert_term()` protects against the creation of terms with duplicate names at the same level of a taxonomy hierarchy. However, it's historically been possible to override this protection by explicitly providing a value of `$slug` that is unique at the hierarchy tier. This ability was broken in [31734], and the current changeset restores the original behavior. A number of unit tests are added and refactored in support of these changes. See #17689 for discussion of a fix that was superceded by [31734]. This commit retains the fix for the underlying bug described in that ticket. See #31328. Built from https://develop.svn.wordpress.org/trunk@31792 git-svn-id: http://core.svn.wordpress.org/trunk@31774 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
a97462e755
commit
650ca95b95
|
@ -2903,15 +2903,29 @@ function wp_insert_term( $term, $taxonomy, $args = array() ) {
|
|||
}
|
||||
}
|
||||
|
||||
// Terms with duplicate names are not allowed at the same level of a taxonomy hierarchy.
|
||||
if ( $existing_term = get_term_by( 'name', $name, $taxonomy ) ) {
|
||||
if ( is_taxonomy_hierarchical( $taxonomy ) ) {
|
||||
$siblings = get_terms( $taxonomy, array( 'fields' => 'names', 'get' => 'all', 'parent' => $parent ) );
|
||||
if ( in_array( $name, $siblings ) ) {
|
||||
return new WP_Error( 'term_exists', __( 'A term with the name already exists with this parent.' ), $existing_term->term_id );
|
||||
/*
|
||||
* Prevent the creation of terms with duplicate names at the same level of a taxonomy hierarchy,
|
||||
* unless a unique slug has been explicitly provided.
|
||||
*/
|
||||
if ( $name_match = get_term_by( 'name', $name, $taxonomy ) ) {
|
||||
$slug_match = get_term_by( 'slug', $slug, $taxonomy );
|
||||
if ( ! $slug_provided || $name_match->slug === $slug || $slug_match ) {
|
||||
if ( is_taxonomy_hierarchical( $taxonomy ) ) {
|
||||
$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' ) ) ) {
|
||||
$existing_term = $name_match;
|
||||
} elseif ( $slug_match && in_array( $slug, wp_list_pluck( $siblings, 'slug' ) ) ) {
|
||||
$existing_term = $slug_match;
|
||||
}
|
||||
|
||||
if ( $existing_term ) {
|
||||
return new WP_Error( 'term_exists', __( 'A term with the name already exists with this parent.' ), $existing_term->term_id );
|
||||
}
|
||||
} else {
|
||||
return new WP_Error( 'term_exists', __( 'A term with the name already exists in this taxonomy.' ), $name_match->term_id );
|
||||
}
|
||||
} else {
|
||||
return new WP_Error( 'term_exists', __( 'A term with the name already exists in this taxonomy.' ), $existing_term->term_id );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* @global string $wp_version
|
||||
*/
|
||||
$wp_version = '4.2-beta1-31791';
|
||||
$wp_version = '4.2-beta1-31792';
|
||||
|
||||
/**
|
||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||
|
|
Loading…
Reference in New Issue