WordPress.org

Make WordPress Core

Ticket #16475: 16475_2.patch

File 16475_2.patch, 3.3 KB (added by tamme, 4 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        // checked has three values: 0 means not checked at all, 1 means checked, and 2 means one ore more of its children are checked.  
     126        foreach( $categories as $cat ) { 
     127                $cat->checked = 0; 
     128        } 
    129129 
    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] ); 
     130        $current_cat; 
     131        foreach( $args['selected_cats'] as $sc ) { 
     132                foreach( $categories as $cat ) { 
     133                        if($cat->term_id == $sc) { 
     134                                $current_cat = $cat; 
    134135                        } 
    135136                } 
    136137 
    137                 // Put checked cats on top 
    138                 echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args)); 
     138                $current_cat->checked = 1; 
     139 
     140                while($current_cat->parent != 0) { 
     141                        foreach( $categories as $cat ) { 
     142                                if($cat->term_id == $current_cat->parent) { 
     143                                        $current_cat = $cat; 
     144                                        $current_cat->checked = 2; 
     145                                } 
     146                        } 
     147                } 
    139148        } 
    140         // Then the rest of them 
    141         echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args)); 
     149 
     150        $final_categories = array(); 
     151 
     152        foreach( $categories as $catk => $cat ) { 
     153                if ($cat->parent == 0 && $cat->checked == 1) { 
     154                        $final_categories[] = $cat; 
     155                        unset( $categories[$catk] ); 
     156                } 
     157        } 
     158 
     159        foreach( $categories as $catk => $cat ) { 
     160                if ($cat->parent == 0 && $cat->checked == 2) { 
     161                        $final_categories[] = $cat; 
     162                        unset( $categories[$catk] ); 
     163                } 
     164        } 
     165 
     166        foreach( $categories as $catk => $cat ) { 
     167                if ($cat->parent == 0) { 
     168                        $final_categories[] = $cat; 
     169                        unset( $categories[$catk] ); 
     170                } 
     171        } 
     172 
     173        foreach( $categories as $catk => $cat ) { 
     174                $final_categories[] = $cat; 
     175                unset( $categories[$catk]); 
     176        } 
     177 
     178        echo call_user_func_array(array(&$walker, 'walk'), array($final_categories, 0, $args)); 
    142179} 
    143180 
    144181/**