How To Get The Primary Category Of A Post Only - Reusable Function

· Travis Rodgers  · 3 min read

In light of WordPress's primary category feature, we sometimes just want to just retrieve that one primary category, not a list of all. In this post, I'll show you how to get the primary category of a post only.

First off, whether a post should have multiple categories or not is for another discussion. The answer is no….I mean…

Second, and more importantly, the functions the_category and get_the_category both return a list of categories. When we select more than one category in a post we get this option to make one of them primary.

But often the need arises to restructure a breadcrumb, post meta layout, etc. and we just want to get the primary category of a post only.

Here’s how to do it:

How to get the primary category of a post only

Shoutout to Jawinn for the actual code. All I did was “functionize” it to make it reusable.

So the function gets one parameter, the list of categories. So whenever using it, be sure to call the get_the_category function beforehand and then place the results in a variable which will be passed to the function.

To make it reusable, place the function in your functions.php, or more preferably in a custom plugin.

function get_primary_category($category){
  $useCatLink = true;
  // If post has a category assigned.
  if ($category){
    $category_display = '';
    $category_link = '';
    if ( class_exists('WPSEO_Primary_Term') )
    {
      // Show the post's 'Primary' category, if this Yoast feature is available, & one is set
      $wpseo_primary_term = new WPSEO_Primary_Term( 'category', get_the_id() );
      $wpseo_primary_term = $wpseo_primary_term->get_primary_term();
      $term = get_term( $wpseo_primary_term );
      if (is_wp_error($term)) {
        // Default to first category (not Yoast) if an error is returned
        $category_display = $category[0]->name;
        $category_link = get_category_link( $category[0]->term_id );
      } else {
        // Yoast Primary category
        $category_display = $term->name;
        $category_link = get_category_link( $term->term_id );
      }
    }
    else {
      // Default, display the first category in WP's list of assigned categories
      $category_display = $category[0]->name;
      $category_link = get_category_link( $category[0]->term_id );
    }
    // Display category
    if ( !empty($category_display) ){
      if ( $useCatLink == true && !empty($category_link) ){
      return '<span class="post-category"><a href="'.$category_link.'">'.htmlspecialchars($category_display).'</a></span>';
      } else {
      return '<span class="post-category">'.htmlspecialchars($category_display).'</span>';
      }
    }
  }
}
    </code>
</pre>

// And for an example of its use:
$category = get_the_category();

echo '<div class="post-category">';
echo get_primary_category($category);
echo '</div>';

Conclusion

And that’s how to get the primary category of a post in a reusable function!!

This page may contain affiliate links. Please see my affiliate disclaimer for more info.

Related Posts

View All Posts »
How to List Out All Post Tags Alphabetized and Indexed

How to List Out All Post Tags Alphabetized and Indexed

I recently was asked by a client to list out all post tags on a page, alphabetized and indexed. Her posts tags were ingredients to her recipes and would allow for an alternative way to search her site. Here's how it looks and the code to go along with it.