tags:

views:

16

answers:

1

I need to make something like wp_list_categories that shows categories that are empty but only if they have children categories that have posts in them. Anyone have any ideas?

Thanks

A: 

You can probably do this with a Walker, but I tried it the old-fashioned way.

$categories = get_categories();

// First index all categories by parent id, for easy lookup later
$cats_by_parent = array();
foreach ($categories as $cat) {
    $parent_id = $cat->category_parent;
    if (!array_key_exists($parent_id, $cats_by_parent)) {
        $cats_by_parent[$parent_id] = array();
    }
    $cats_by_parent[$parent_id][] = $cat;
}

// Then build a hierarchical tree
$cat_tree = array();
function add_cats_to_bag(&$child_bag, &$children)
{
    global $cats_by_parent;
    foreach ($children as $child_cat) {
        $child_id = $child_cat->cat_ID;
        if (array_key_exists($child_id, $cats_by_parent)) {
            $child_cat->children = array();
            add_cats_to_bag($child_cat->children, $cats_by_parent[$child_id]);
        }
        $child_bag[$child_id] = $child_cat;
    }
}
add_cats_to_bag($cat_tree, $cats_by_parent[0]);

// With this real tree, this recursive function can check for the cats you need
function has_children_with_posts(&$children)
{
    $has_child_with_posts = false;
    foreach ($children as $child_cat) {
        $has_grandchildren_with_posts = false;
        if (isset($child_cat->children)) {
            // Here is our recursive call so we don't miss any subcats
            if (has_children_with_posts($child_cat->children)) {
                $has_grandchildren_with_posts = true;
            }
        }
        if (0 < intval($child_cat->category_count)) {
            $has_child_with_posts = true;
        } else if ($has_grandchildren_with_posts) {
            // This is a category that has no posts, but does have children that do
            $child_cat->is_empty_with_children = true;
            var_dump($child_cat->name);
        }
    }
    return $has_child_with_posts;
}
has_children_with_posts($cat_tree);
Jan Fabry