diff --git src/wp-includes/taxonomy.php src/wp-includes/taxonomy.php
index 5846844..0c12c4c 100644
--- src/wp-includes/taxonomy.php
+++ src/wp-includes/taxonomy.php
@@ -1654,12 +1654,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 ";
@@ -1685,8 +1685,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 tests/phpunit/tests/term.php tests/phpunit/tests/term.php
index 180e87d..c9bd074 100644
--- tests/phpunit/tests/term.php
+++ tests/phpunit/tests/term.php
@@ -138,6 +138,28 @@ class Tests_Term extends WP_UnitTestCase {
 		$this->assertEquals( $t, $found['term_id'] );
 	}
 
+	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,
