diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index fe996b1f73..0e29545bab 100644 --- a/src/wp-includes/taxonomy.php +++ b/src/wp-includes/taxonomy.php @@ -1655,12 +1655,12 @@ function get_terms( $taxonomies, $args = '' ) { * * @param int|string $term The term to check * @param string $taxonomy The taxonomy name to use - * @param int $parent ID of parent term under which to confine the exists search. + * @param int $parent Optional. ID of parent term under which to confine the exists search. * @return mixed Returns 0 if the term does not exist. Returns the term ID if no taxonomy is specified * and the term ID exists. Returns an array of the term ID and the term taxonomy ID * if the taxonomy is specified and the pairing exists. */ -function term_exists($term, $taxonomy = '', $parent = 0) { +function term_exists( $term, $taxonomy = '', $parent = null ) { global $wpdb; $select = "SELECT term_id FROM $wpdb->terms as t WHERE "; @@ -1686,8 +1686,8 @@ function term_exists($term, $taxonomy = '', $parent = 0) { $where_fields = array($slug); $else_where_fields = array($term); if ( !empty($taxonomy) ) { - $parent = (int) $parent; - if ( $parent > 0 ) { + if ( is_numeric( $parent ) ) { + $parent = (int) $parent; $where_fields[] = $parent; $else_where_fields[] = $parent; $where .= ' AND tt.parent = %d'; diff --git a/tests/phpunit/tests/term.php b/tests/phpunit/tests/term.php index f7d8615820..9b0a92ad68 100644 --- a/tests/phpunit/tests/term.php +++ b/tests/phpunit/tests/term.php @@ -138,6 +138,31 @@ class Tests_Term extends WP_UnitTestCase { $this->assertEquals( $t, $found['term_id'] ); } + /** + * @ticket 29851 + */ + public function test_term_exists_taxonomy_nonempty_parent_0_should_return_false_for_child_term() { + register_taxonomy( 'foo', 'post', array( + 'hierarchical' => true, + ) ); + + $parent_term = $this->factory->term->create( array( + 'taxonomy' => 'foo', + ) ); + + $t = $this->factory->term->create( array( + 'taxonomy' => 'foo', + 'parent' => $parent_term, + 'slug' => 'child-term', + ) ); + + $found = term_exists( 'child-term', 'foo', 0 ); + + _unregister_taxonomy( 'foo' ); + + $this->assertSame( null, $found['term_id'] ); + } + public function test_term_exists_taxonomy_nonempty_parent_nonempty_match_name() { register_taxonomy( 'foo', 'post', array( 'hierarchical' => true,