diff --git a/src/wp-admin/includes/ajax-actions.php b/src/wp-admin/includes/ajax-actions.php
index 30dffbc31b..c9b4563bc4 100644
--- a/src/wp-admin/includes/ajax-actions.php
+++ b/src/wp-admin/includes/ajax-actions.php
@@ -788,7 +788,7 @@ function wp_ajax_add_tag() {
 
 	$level = 0;
 	if ( is_taxonomy_hierarchical($taxonomy) ) {
-		$level = count( get_ancestors( $tag->term_id, $taxonomy ) );
+		$level = count( get_ancestors( $tag->term_id, $taxonomy, 'taxonomy' ) );
 		ob_start();
 		$wp_list_table->single_row( $tag, $level );
 		$noparents = ob_get_clean();
diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php
index 4ca5369f06..44307fae60 100644
--- a/src/wp-includes/taxonomy.php
+++ b/src/wp-includes/taxonomy.php
@@ -4054,7 +4054,7 @@ function get_term_link( $term, $taxonomy = '') {
 	} else {
 		if ( $t->rewrite['hierarchical'] ) {
 			$hierarchical_slugs = array();
-			$ancestors = get_ancestors($term->term_id, $taxonomy);
+			$ancestors = get_ancestors( $term->term_id, $taxonomy, 'taxonomy' );
 			foreach ( (array)$ancestors as $ancestor ) {
 				$ancestor_term = get_term($ancestor, $taxonomy);
 				$hierarchical_slugs[] = $ancestor_term->slug;
@@ -4279,11 +4279,16 @@ function is_object_in_taxonomy($object_type, $taxonomy) {
 /**
  * Get an array of ancestor IDs for a given object.
  *
- * @param int $object_id The ID of the object
- * @param string $object_type The type of object for which we'll be retrieving ancestors.
- * @return array of ancestors from lowest to highest in the hierarchy.
+ * @since 3.1.0
+ * @since 4.1.0 Introduced the 'resource_type' parameter.
+ *
+ * @param int    $object_id     The ID of the object.
+ * @param string $object_type   The type of object for which we'll be retrieving ancestors.
+ *                              Accepts a post type or a taxonomy name.
+ * @param string $resource_type Optional. Type of resource $object_type is. Accepts 'post_type' or 'taxonomy'.
+ * @return array An array of ancestors from lowest to highest in the hierarchy.
  */
-function get_ancestors($object_id = 0, $object_type = '') {
+function get_ancestors( $object_id = 0, $object_type = '', $resource_type = '' ) {
 	$object_id = (int) $object_id;
 
 	$ancestors = array();
@@ -4291,16 +4296,24 @@ function get_ancestors($object_id = 0, $object_type = '') {
 	if ( empty( $object_id ) ) {
 
 		/** This filter is documented in wp-includes/taxonomy.php */
-		return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type );
+		return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type, $resource_type );
 	}
 
-	if ( is_taxonomy_hierarchical( $object_type ) ) {
+	if ( ! $resource_type ) {
+		if ( is_taxonomy_hierarchical( $object_type ) ) {
+			$resource_type = 'taxonomy';
+		} else if ( post_type_exists( $object_type ) ) {
+			$resource_type = 'post_type';
+		}
+	}
+
+	if ( 'taxonomy' === $resource_type ) {
 		$term = get_term($object_id, $object_type);
 		while ( ! is_wp_error($term) && ! empty( $term->parent ) && ! in_array( $term->parent, $ancestors ) ) {
 			$ancestors[] = (int) $term->parent;
 			$term = get_term($term->parent, $object_type);
 		}
-	} elseif ( post_type_exists( $object_type ) ) {
+	} elseif ( 'post_type' === $resource_type ) {
 		$ancestors = get_post_ancestors($object_id);
 	}
 
@@ -4309,9 +4322,10 @@ function get_ancestors($object_id = 0, $object_type = '') {
 	 *
 	 * @since 3.1.0
 	 *
-	 * @param array  $ancestors   An array of object ancestors.
-	 * @param int    $object_id   Object ID.
-	 * @param string $object_type Type of object.
+	 * @param array  $ancestors     An array of object ancestors.
+	 * @param int    $object_id     Object ID.
+	 * @param string $object_type   Type of object.
+	 * @param string $resource_type Type of resource $object_type is.
 	 */
 	return apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type );
 }
diff --git a/tests/phpunit/tests/taxonomy.php b/tests/phpunit/tests/taxonomy.php
index cab1caa45b..1fd3cd356c 100644
--- a/tests/phpunit/tests/taxonomy.php
+++ b/tests/phpunit/tests/taxonomy.php
@@ -234,4 +234,103 @@ class Tests_Taxonomy extends WP_UnitTestCase {
 		);
 		$this->assertEquals( 0, wp_insert_category( $cat, false ) );
 	}
+
+	public function test_get_ancestors_taxonomy_non_hierarchical() {
+		register_taxonomy( 'wptests_tax', 'post' );
+		$t = $this->factory->term->create( array(
+			'taxonomy' => 'wptests_tax',
+		) );
+
+		$this->assertSame( array(), get_ancestors( $t, 'wptests_tax' ) );
+		_unregister_taxonomy( 'wptests_tax' );
+	}
+
+	public function test_get_ancestors_taxonomy() {
+		register_taxonomy( 'wptests_tax', 'post', array(
+			'hierarchical' => true,
+		) );
+		$t1 = $this->factory->term->create( array(
+			'taxonomy' => 'wptests_tax',
+		) );
+		$t2 = $this->factory->term->create( array(
+			'taxonomy' => 'wptests_tax',
+			'parent' => $t1,
+		) );
+		$t3 = $this->factory->term->create( array(
+			'taxonomy' => 'wptests_tax',
+			'parent' => $t2,
+		) );
+		$t4 = $this->factory->term->create( array(
+			'taxonomy' => 'wptests_tax',
+			'parent' => $t1,
+		) );
+
+		$this->assertEqualSets( array( $t2, $t1 ), get_ancestors( $t3, 'wptests_tax' ) );
+		_unregister_taxonomy( 'wptests_tax' );
+	}
+
+	public function test_get_ancestors_post_type_non_hierarchical() {
+		register_post_type( 'wptests_pt' );
+		$p = $this->factory->post->create( array(
+			'taxonomy' => 'wptests_pt',
+		) );
+
+		$this->assertEqualSets( array(), get_ancestors( $p, 'wptests_tax' ) );
+	}
+
+	public function test_get_ancestors_post_type() {
+		register_post_type( 'wptests_pt', array(
+			'hierarchical' => true,
+		) );
+		$p1 = $this->factory->post->create( array(
+			'post_type' => 'wptests_pt',
+		) );
+		$p2 = $this->factory->post->create( array(
+			'post_type' => 'wptests_pt',
+			'post_parent' => $p1,
+		) );
+		$p3 = $this->factory->post->create( array(
+			'post_type' => 'wptests_pt',
+			'post_parent' => $p2,
+		) );
+		$p4 = $this->factory->post->create( array(
+			'post_type' => 'wptests_pt',
+			'post_parent' => $p1,
+		) );
+
+		$this->assertEqualSets( array( $p2, $p1 ), get_ancestors( $p3, 'wptests_pt' ) );
+		_unregister_post_type( 'wptests_pt' );
+	}
+
+	/**
+	 * @ticket 15029
+	 */
+	public function test_get_ancestors_taxonomy_post_type_conflict_resource_type_taxonomy() {
+		register_post_type( 'wptests_conflict', array(
+			'hierarchical' => true,
+		) );
+		$p1 = $this->factory->post->create( array(
+			'post_type' => 'wptests_conflict',
+		) );
+		$p2 = $this->factory->post->create( array(
+			'post_type' => 'wptests_conflict',
+			'post_parent' => $p1,
+		) );
+
+		register_taxonomy( 'wptests_conflict', 'post', array(
+			'hierarchical' => true,
+		) );
+		$t1 = $this->factory->term->create( array(
+			'taxonomy' => 'wptests_conflict',
+		) );
+		$t2 = $this->factory->term->create( array(
+			'taxonomy' => 'wptests_conflict',
+			'parent' => $t1,
+		) );
+
+		$this->assertEqualSets( array( $p1 ), get_ancestors( $p2, 'wptests_conflict', 'post_type' ) );
+		$this->assertEqualSets( array( $t1 ), get_ancestors( $t2, 'wptests_conflict', 'taxonomy' ) );
+		$this->assertEqualSets( array( $t1 ), get_ancestors( $t2, 'wptests_conflict' ) );
+		_unregister_post_type( 'wptests_pt' );
+	}
 }