Index: wp-includes/category-template.php
===================================================================
--- wp-includes/category-template.php	(revision 18607)
+++ wp-includes/category-template.php	(working copy)
@@ -36,29 +36,46 @@
  * @param bool $link Optional, default is false. Whether to format with link.
  * @param string $separator Optional, default is '/'. How to separate categories.
  * @param bool $nicename Optional, default is false. Whether to use nice name for display.
- * @param array $visited Optional. Already linked to categories to prevent duplicates.
+ * @param array $deprecated Not used.
  * @return string
  */
-function get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $visited = array() ) {
+function get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $deprecated = array() ) {
+	return get_term_parents( $id, 'category', $link, $separator, $nicename );
+}
+
+/**
+ * Retrieve term parents with separator.
+ *
+ * @since 3.3.0
+ *
+ * @param int $id Term ID.
+ * @param string $taxonomy Taxonomy name.
+ * @param bool $link Optional, default is false. Whether to format with link.
+ * @param string $separator Optional, default is '/'. How to separate categories.
+ * @param bool $nicename Optional, default is false. Whether to use nice name for display.
+ * @param array $deprecated Not used.
+ * @return string
+ */
+function get_term_parents( $id, $taxonomy, $link = false, $separator = '/', $nicename = false, $deprecated = array() ) {
+	$term = &get_term( $id, $taxonomy );
+	if ( is_wp_error( $term ) )
+		return $term;
+
 	$chain = '';
-	$parent = &get_category( $id );
-	if ( is_wp_error( $parent ) )
-		return $parent;
 
-	if ( $nicename )
-		$name = $parent->slug;
-	else
-		$name = $parent->name;
+	$parents = get_ancestors( $id, $taxonomy );
+	array_unshift( $parents, $id );
 
-	if ( $parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited ) ) {
-		$visited[] = $parent->parent;
-		$chain .= get_category_parents( $parent->parent, $link, $separator, $nicename, $visited );
+	foreach ( array_reverse( $parents ) as $term_id ) {
+		$term = &get_term( $term_id, $taxonomy );
+
+		$name = ( $nicename ) ? $term->slug : $term->name;
+		if ( $link )
+			$chain .= '<a href="' . get_term_link( $term->slug, $taxonomy ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $term->name ) ) . '">' . $name . '</a>' . $separator;
+		else
+			$chain .= $name.$separator;
 	}
 
-	if ( $link )
-		$chain .= '<a href="' . get_category_link( $parent->term_id ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . '">'.$name.'</a>' . $separator;
-	else
-		$chain .= $name.$separator;
 	return $chain;
 }
 
