How can I get only parent terms?

Is there any way to get only parent terms from custom taxonomy or category?

Related posts

Leave a Reply

5 comments

  1. Yes, just pass in the parent parameter to get_terms when you call it, as Michael pointed out.

    Since WP 4.5 this is the recommend usage:

    $myterms = get_terms( array( 'taxonomy' => 'taxonomy_name', 'parent' => 0 ) );
    

    Prior to WP 4.5 this was the default usage:

    $myterms = get_terms( 'taxonomy_name_here', array( 'parent' => 0 ) );
    

    Will return all terms that have a parent value of 0, ie. top level terms.

  2. for woocommerce email templates use the following:

    $terms = get_the_terms( $_product->id , 'product_cat');
        if($terms) {
            foreach( $terms as $term ) {
                $term = get_term_by("id", $term->parent, "product_cat");
                if ($term->parent > 0) {
                    $term = get_term_by("id", $term->parent, "product_cat");
                }
                $cat_obj = get_term($term->term_id, 'product_cat');
                $cat_name = $cat_obj->name;
            }
        }
    echo '<br />('. $cat_name . ')';
    
  3. For this demonstration, we will assume that we have a taxonomy called “Books”.
    And we might have a hierarchy of:

    Fiction (id: 699)
     - This is a Fiction Story.
    Non-Fiction
     - Title of Non-fiction
    Fantasy
      -  ...
    

    We want to get the parent term of the taxonomy “Books” of the current post.

    /* Get the Parent Taxonomy Term Name by post Id */
    
    function get_parent_term_by_post_id($taxname, $taxid=null){
    
    if(isset($taxid)):
    
        //Get by term Id passed in function
        $parent_tax = get_term_by('id', $taxid, $taxname);
    
        return $parent_tax ->name; //use name, slug, or id
    
    else:
    
         //Get by PostId of current page
         $terms = wp_get_post_terms( get_the_id(), $taxname);
    
         $tax_parent_id = $terms[0]->parent;
    
         if($tax_parent_id == 0):
          $tax_parent_id = $terms[0]->parent; //get the next parent ID
         endif; 
    
         $parent_tax = get_term_by('id', $tax_parent_id , $taxname);
    
         return $parent_tax ->name; //use name, slug, or id
    
    endif;
    
    }
    

    Then you just run on you template like this:

    //enter custom tax name. will grab by post id 
    echo get_parent_term_name_by_post_id('books'); //returns Fiction
    

    or

    //by term ID 
    echo get_parent_term_name_by_post_id('books', 699); //returns Fiction