WordPress function to get top level category of a post

How to find the top most category of a post in wordpress?

For example I have categories like this:sub-1.2, sub-2.2, parent-3.

Parent-1
    - sub-1.1
         - sub-1.2
Parent-2
    - sub-2.1
         - sub-2.2
Parent-3
    - sub-3.1
         - sub-3.2

Now I want to get the top most categories like Parent-1,Parent-2, Parent-3.

/**
 * Get Post Ancestor Categories
 *
 * @param int    $post_id Post ID.
 * @param string $format slug or name of the category.
 * @return array
 */
function readnote_get_post_root_category( $post_id, $format = 'slug' ) {
	$taxonomy = 'category';
	$list     = array();
	$terms = get_the_category( $post_id );
	foreach ( $terms as $term ) {
		$parents = get_ancestors( $term->term_taxonomy_id, $taxonomy, 'taxonomy' );
		array_unshift( $parents, $term->term_taxonomy_id );
		$ancestors[] = end( $parents );
	}
	$ancestors = array_merge( array_unique( $ancestors ), array() );
	foreach ( $ancestors as $term_id ) {
		$ancestor = get_term( $term_id, $taxonomy );
		$name     = ( 'slug' === $format ) ? $ancestor->slug : $ancestor->name;
		$list[] = $name;
	}
	return $list;
}

II feel that this solution is quite simple, probably not the best one in terms of efficiency and there may be a better one.

Looking forward to discussing with you.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.