How can I get all subcategories from a certain category?
2 Answers
Yes, you can use get_categories() using 'child_of'
attribute.
For example all sub categories of category with the ID of 17:
$args = array('child_of' => 17);
$categories = get_categories( $args );
foreach($categories as $category) {
echo '<p>Category: <a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a> </p> ';
echo '<p> Description:'. $category->description . '</p>';
echo '<p> Post Count: '. $category->count . '</p>';
}
This will get all categories that are descendants (i.e. children & grandchildren).
If you want to display only categories that are direct descendants (i.e. children only) you can use 'parent'
attribute.
$args = array('parent' => 17);
$categories = get_categories( $args );
foreach($categories as $category) {
echo '<p>Category: <a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a> </p> ';
echo '<p> Description:'. $category->description . '</p>';
echo '<p> Post Count: '. $category->count . '</p>';
}
-
7Just a suggestion: With the popularity of custom post types and taxonomies, i feel it would be better to be suggesting
get_terms
, because this helps familiarise users with general term fetching functions, where as the category functions are somewhat specific to the built-in taxonomy(though not in all cases). You don't have to agree of course, it's just a suggestion... ;)– t31osCommented Mar 30, 2011 at 14:49 -
2
-
1
-
1please note, by default, this will not get you categories that has no post associated with them. use
hide_empty => false
to get all categories (as per the recent version of wordpress) Commented Feb 4, 2020 at 14:06
For custom post types "categories" use get_terms().
(Altering @Bainternet's answer)
$categories = get_terms( array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'parent' => 17 // or
//'child_of' => 17 // to target not only direct children
) );
foreach($categories as $category) {
echo '<p>Category: <a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a> </p> ';
echo '<p> Description:'. $category->description . '</p>';
echo '<p> Post Count: '. $category->count . '</p>';
}