2010-07-20 54 views

回答

2

你或許可以做到這一點與Walker,但我試了老式的方法。

$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);