WordPress.org

Make WordPress Core

Ticket #3985: 3985.diff

File 3985.diff, 2.0 KB (added by ryan, 8 years ago)

First cut at caching category children

  • wp-includes/category.php

     
    109109                unset($cat_stamps); 
    110110        } 
    111111 
    112         if ( $child_of || $hierarchical ) 
    113                 $categories = & _get_cat_children($child_of, $categories); 
     112        if ( $child_of || $hierarchical ) { 
     113                $children = _get_category_hierarchy(); 
     114                if ( ! empty($children) ) 
     115                        $categories = & _get_cat_children($child_of, $categories); 
     116        } 
    114117 
    115118        // Update category counts to include children. 
    116119        if ( $pad_counts ) 
     
    260263                return array(); 
    261264 
    262265        $category_list = array(); 
     266        $children = _get_category_hierarchy(); 
    263267        foreach ( $categories as $category ) { 
    264268                if ( $category->cat_ID == $category_id ) 
    265269                        continue; 
    266270 
    267271                if ( $category->category_parent == $category_id ) { 
    268272                        $category_list[] = $category; 
     273                        if ( !isset($children[$category->cat_ID]) ) 
     274                                continue; 
     275                         
    269276                        if ( $children = _get_cat_children($category->cat_ID, $categories) ) 
    270277                                $category_list = array_merge($category_list, $children); 
    271278                } 
     
    313320                        $cats[$id]->{'link' == $type ? 'link_count' : 'category_count'} = count($items); 
    314321} 
    315322 
     323function _get_category_hierarchy() { 
     324        $children = get_option('category_children'); 
     325        if ( is_array($children) ) 
     326                return $children; 
     327 
     328        $children = array(); 
     329        $categories = get_categories('hide_empty=0&hierarchical=0'); 
     330        foreach ( $categories as $cat ) { 
     331                if ( $cat->category_parent > 0 ) 
     332                        $children[$cat->category_parent][] = $cat->ID; 
     333        } 
     334        update_option('category_children', $children); 
     335 
     336        return $children; 
     337} 
    316338?> 
  • wp-includes/functions.php

     
    749749        wp_cache_delete($id, 'category'); 
    750750        wp_cache_delete('all_category_ids', 'category'); 
    751751        wp_cache_delete('get_categories', 'category'); 
     752        delete_option('category_children'); 
    752753} 
    753754 
    754755/*