Make WordPress Core

Ticket #26475: 26475.patch

File 26475.patch, 1.9 KB (added by tyxla, 10 years ago)

Display and preserve the full hierarchy of any selected item in the category selection list in the Edit Post screen.

  • src/wp-admin/includes/template.php

     
    240240
    241241                foreach( $keys as $k ) {
    242242                        if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) {
    243                                 $checked_categories[] = $categories[$k];
     243                                $checked_categories[$categories[$k]->term_id] = $categories[$k];
    244244                                unset( $categories[$k] );
    245245                        }
    246246                }
    247247
    248                 // Put checked cats on top
     248                // Add the full hierarchy of the checked categories
     249                foreach ( $checked_categories as $cat ) {
     250                        // Get the checked category ancestor
     251                        $cat_parent = $cat;
     252                        while ( $cat_parent->parent != 0 ) {   
     253                                $cat_parent = get_term_by( 'id', $cat_parent->parent, $taxonomy );
     254                        }
     255
     256                        // Include the ancestor
     257                        if ( ! array_key_exists( $cat_parent->term_id, $checked_categories ) ) {
     258                                $checked_categories[$cat_parent->term_id] = $cat_parent;
     259                        }
     260
     261                        // Include the children categories of the ancestor
     262                        $children_cats = get_terms( $taxonomy, array(
     263                                'child_of' => $cat_parent->term_id,
     264                                'fields' => 'ids',
     265                                'hide_empty' => 0,
     266                        ) );
     267                        if ( $children_cats ) {
     268                                foreach ( $children_cats as $child_cat_id ) {
     269                                        $child_cat = get_term_by( 'id', $child_cat_id, $taxonomy );
     270                                        if ( ! array_key_exists( $child_cat->term_id, $checked_categories ) ) {
     271                                                $checked_categories[$child_cat->term_id] = $child_cat;
     272                                        }
     273                                }
     274                        }
     275                }
     276
     277                // Unset the newly found categories to avoid duplication
     278                foreach ( $categories as $key => $category ) {
     279                        if ( array_key_exists( $category->term_id, $checked_categories ) ) {
     280                                unset( $categories[$key] );
     281                        }
     282                }
     283
     284                // Put checked cats and their hierarchy on top
    249285                echo call_user_func_array( array( $walker, 'walk' ), array( $checked_categories, 0, $args ) );
    250286        }
    251287        // Then the rest of them