WordPress.org

Make WordPress Core

Ticket #2738: pad-counts.diff

File pad-counts.diff, 4.7 KB (added by andy, 7 years ago)
  • wp-includes/category.php

     
    2121 
    2222        $defaults = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC', 
    2323                'hide_empty' => true, 'include_last_update_time' => false, 'hierarchical' => 1, 'exclude' => '', 'include' => '', 
    24                 'number' => ''); 
     24                'number' => '', 'pad_counts' => false); 
    2525        $r = array_merge($defaults, $r); 
    2626        if ( 'count' == $r['orderby'] ) 
    2727                $r['orderby'] = 'category_count'; 
     
    109109                $categories = & _get_cat_children($child_of, $categories); 
    110110 
    111111        // Update category counts to include children. 
    112         if ( $hierarchical ) { 
     112        if ( $pad_counts ) 
     113                pad_category_counts($type, $categories); 
     114 
     115        // Make sure we show empty categories that have children. 
     116        if ( $hierarchical && $hide_empty ) { 
    113117                foreach ( $categories as $k => $category ) { 
    114                         $progeny = 'link' == $type ? $category->link_count : $category->category_count; 
    115                         if ( $children = _get_cat_children($category->cat_ID, $categories) ) { 
     118                        if ( ! $category->{'link' == $type ? 'link_count' : 'category_count'} ) { 
     119                                $children = _get_cat_children($category->cat_ID, $categories); 
    116120                                foreach ( $children as $child ) 
    117                                         $progeny += 'link' == $type ? $child->link_count : $child->category_count; 
     121                                        if ( $child->{'link' == $type ? 'link_count' : 'category_count'} ) 
     122                                                continue 2; 
     123 
     124                                // It really is empty 
     125                                unset($categories[$k]); 
    118126                        } 
    119                         if ( !$progeny && $hide_empty ) 
    120                                 unset($categories[$k]); 
    121                         else 
    122                                 $categories[$k]->{'link' == $type ? 'link_count' : 'category_count'} = $progeny; 
    123127                } 
    124128        } 
    125129        reset ( $categories ); 
     
    130134        return apply_filters('get_categories', $categories, $r); 
    131135} 
    132136 
     137// Recalculates link or post counts by including items from child categories 
     138// Assumes all relevant children are already in the $categories argument 
     139function pad_category_counts($type, &$categories) { 
     140        global $wpdb; 
     141 
     142        // Set up some useful arrays 
     143        foreach ( $categories as $key => $cat ) { 
     144                $cats[$cat->cat_ID] = & $categories[$key]; 
     145                $cat_IDs[] = $cat->cat_ID; 
     146        } 
     147 
     148        // Get the relevant post2cat or link2cat records and stick them in a lookup table 
     149        if ( $type == 'post' ) { 
     150                $results = $wpdb->get_results("SELECT post_id, category_id FROM $wpdb->post2cat LEFT JOIN $wpdb->posts ON post_id = ID WHERE category_id IN (".join(',', $cat_IDs).") AND post_type = 'post' AND post_status = 'publish'"); 
     151                foreach ( $results as $row ) 
     152                        ++$cat_items[$row->category_id][$row->post_id]; 
     153        } else { 
     154                $results = $wpdb->get_results($q="SELECT $wpdb->link2cat.link_id, category_id FROM $wpdb->link2cat LEFT JOIN $wpdb->links USING (link_id) WHERE category_id IN (".join(',', $cat_IDs).") AND link_visible = 'Y'");echo $q; 
     155                foreach ( $results as $row ) 
     156                        ++$cat_items[$row->category_id][$row->link_id]; 
     157        } 
     158 
     159        // Touch every ancestor's lookup row for each post in each category 
     160        foreach ( $cat_IDs as $cat_ID ) { 
     161                $child = $cat_ID; 
     162                while ( $parent = $cats[$child]->category_parent ) { 
     163                        if ( !empty($cat_items[$cat_ID]) ) 
     164                                foreach ( $cat_items[$cat_ID] as $item_id => $touches ) 
     165                                        ++$cat_items[$parent][$item_id]; 
     166                        $child = $parent; 
     167                } 
     168        } 
     169 
     170        // Transfer the touched cells  
     171        foreach ( $cat_items as $id => $items ) 
     172                if ( isset($cats[$id]) ) 
     173                        $cats[$id]->{'link' == $type ? 'link_count' : 'category_count'} = count($items); 
     174} 
     175 
    133176// Retrieves category data given a category ID or category object. 
    134177// Handles category caching. 
    135178function &get_category(&$category, $output = OBJECT) { 
  • wp-includes/category-template.php

     
    221221                'child_of' => 0, 'feed' => '', 'feed_image' => '', 'exclude' => '', 
    222222                'hierarchical' => true, 'title_li' => __('Categories')); 
    223223        $r = array_merge($defaults, $r); 
     224        if ( !isset($r['pad_counts']) && $r['show_count'] && $r['hierarchical'] ) 
     225                $r['pad_counts'] = true; 
    224226        if ( isset($r['show_date']) ) 
    225227                $r['include_last_update_time'] = $r['show_date']; 
    226228        extract($r); 
  • wp-content/themes/default/sidebar.php

     
    4646                                </ul> 
    4747                        </li> 
    4848 
    49                         <?php wp_list_categories('optioncount=1&title_li=<h2>Categories</h2>'); ?> 
     49                        <?php wp_list_categories('show_count=1&title_li=<h2>Categories</h2>'); ?> 
    5050 
    5151                        <?php /* If this is the frontpage */ if ( is_home() || is_page() ) { ?> 
    5252                                <?php wp_list_bookmarks(); ?>