I want to say that the above answer worked for me, but I needed to make some slight adjustments to the if statement. I also made an adjustment to work like...
if the post category is a parent, display the children
if the post category is a parent but has no children, display posts
<?php
$cat_id = get_query_var('cat');
if( ! empty( $cat_id ) ) {
$category = get_category( $cat_id, ARRAY_A );
if( ! empty( $category ) ) {
// parent category
if( $category['parent'] === '0' ) {
// get child IDs
$terms = get_term_children( $cat_id, 'category' );
//checks to see if children exist
if ($terms[0] != '') {
foreach( $terms as $term_id ) {
$child_category = get_term( $term_id, 'category' );
// if you need the category
$category_name = $child_category->name;
/**
* Sample data in your child category object:
*
* object(stdClass)[365]
public 'term_id' => string '14' (length=2)
public 'name' => string 'Child 1' (length=7)
public 'slug' => string 'child-1' (length=7)
public 'term_group' => string '0' (length=1)
public 'term_taxonomy_id' => string '14' (length=2)
public 'taxonomy' => string 'category' (length=8)
public 'description' => string '' (length=0)
public 'parent' => string '12' (length=2)
public 'count' => string '5' (length=1)
public 'object_id' => string '33' (length=2)
*
*
*/
// do whatever you like with the categories now...
}
}
else { // in child category
// do the regular loop here, if ( have_posts() ) ...
}
}
}
}