wordpress wp_list_categories problem

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

Related posts

Leave a Reply

1 comment

  1. 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);