How can I get only parent terms?
-
21-04-2021 - |
Question
Is there any way to get only parent terms from custom taxonomy or category?
La solution
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.
Autres conseils
use the 'parent' parameter:
http://codex.wordpress.org/Function_Reference/get_terms
or
http://codex.wordpress.org/Function_Reference/get_categories
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 . ')';
$archive_cats= get_terms( 'archivecat', 'orderby=count&hide_empty=0&parent=0' );
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