WordPress.org

Make WordPress Core

Ticket #16475: 16475.patch

File 16475.patch, 3.0 KB (added by tamme, 7 years ago)
  • wp-admin/includes/template.php

     
    9090                'taxonomy' => 'category',
    9191                'checked_ontop' => true
    9292        );
     93
    9394        extract( wp_parse_args($args, $defaults), EXTR_SKIP );
    9495
    95         if ( empty($walker) || !is_a($walker, 'Walker') )
     96        if ( empty($walker) || !is_a($walker, 'Walker') ) 
    9697                $walker = new Walker_Category_Checklist;
    9798
    9899        $descendants_and_self = (int) $descendants_and_self;
    99 
    100100        $args = array('taxonomy' => $taxonomy);
    101 
    102101        $tax = get_taxonomy($taxonomy);
    103102        $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    104103
    105104        if ( is_array( $selected_cats ) )
    106105                $args['selected_cats'] = $selected_cats;
    107         elseif ( $post_id )
     106        elseif ( $post_id ) 
    108107                $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    109108        else
    110109                $args['selected_cats'] = array();
    111110
    112111        if ( is_array( $popular_cats ) )
     112
    113113                $args['popular_cats'] = $popular_cats;
    114114        else
    115115                $args['popular_cats'] = get_terms( $taxonomy, array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
     
    122122                $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    123123        }
    124124
    125         if ( $checked_ontop ) {
    126                 // Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache)
    127                 $checked_categories = array();
    128                 $keys = array_keys( $categories );
     125        $final_categories = array();
     126        $top_level = true;
    129127
    130                 foreach( $keys as $k ) {
    131                         if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) {
    132                                 $checked_categories[] = $categories[$k];
    133                                 unset( $categories[$k] );
     128        while(count($categories) > 0){
     129                foreach( $args['selected_cats'] as $sk ) {
     130                        foreach( $categories as $catk => $cat ) {
     131                                if ($cat->term_id == $sk && $top_level && $cat->parent == 0) {
     132                                        $final_categories[] = $cat;
     133                                        unset( $categories[$catk] );
     134                                }
     135                                else if ($cat->term_id == $sk) {
     136                                        foreach( $final_categories as $fk ) {
     137                                                if($fk->term_id == $cat->parent) {
     138                                                        $final_categories[] = $cat;
     139                                                        unset( $categories[$catk] );
     140                                                }
     141                                        }
     142                                }
    134143                        }
    135144                }
     145                foreach( $categories as $catk => $cat ) {
     146                        if ($top_level && $cat->parent == 0) {
     147                                $final_categories[] = $cat;
     148                                unset( $categories[$catk] );
     149                        }
     150                        else {
     151                                foreach( $final_categories as $fk ) {
     152                                        if($fk->term_id == $cat->parent) {
     153                                                $final_categories[] = $cat;
     154                                                unset( $categories[$catk] );
     155                                        }
     156                                }
     157                        }
     158                }
     159                $top_level = false;
     160        }
    136161
    137                 // Put checked cats on top
    138                 echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args));
    139         }
    140         // Then the rest of them
    141         echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args));
     162        echo call_user_func_array(array(&$walker, 'walk'), array($final_categories, 0, $args));
    142163}
    143164
    144165/**