WordPress.org

Make WordPress Core

Ticket #19136: groups.3.diff

File groups.3.diff, 15.0 KB (added by koopersmith, 2 years ago)
  • wp-includes/admin-bar.php

     
    9090 
    9191        // Add WordPress.org link 
    9292        $wp_admin_bar->add_menu( array( 
    93                 'parent'    => 'wp-logo', 
    94                 'secondary' => true, 
     93                'parent'    => 'wp-logo-external', 
    9594                'id'        => 'wporg', 
    9695                'title'     => __('WordPress.org'), 
    9796                'href'      => __('http://wordpress.org'), 
     
    9998 
    10099        // Add codex link 
    101100        $wp_admin_bar->add_menu( array( 
    102                 'parent'    => 'wp-logo', 
    103                 'secondary' => true, 
     101                'parent'    => 'wp-logo-external', 
    104102                'id'        => 'documentation', 
    105103                'title'     => __('Documentation'), 
    106104                'href'      => __('http://codex.wordpress.org'), 
     
    108106 
    109107        // Add forums link 
    110108        $wp_admin_bar->add_menu( array( 
    111                 'parent'    => 'wp-logo', 
    112                 'secondary' => true, 
     109                'parent'    => 'wp-logo-external', 
    113110                'id'        => 'support-forums', 
    114111                'title'     => __('Support Forums'), 
    115112                'href'      => __('http://wordpress.org/support/'), 
     
    117114 
    118115        // Add feedback link 
    119116        $wp_admin_bar->add_menu( array( 
    120                 'parent'    => 'wp-logo', 
    121                 'secondary' => true, 
     117                'parent'    => 'wp-logo-external', 
    122118                'id'        => 'feedback', 
    123119                'title'     => __('Feedback'), 
    124120                'href'      => __('http://wordpress.org/support/forum/requests-and-feedback'), 
     
    143139 
    144140                $wp_admin_bar->add_menu( array( 
    145141                        'id'        => 'my-account', 
    146                         'secondary' => true, 
     142                        'parent'    => 'top-secondary', 
    147143                        'title'     => $howdy . $avatar, 
    148144                        'href'      => $profile_url, 
    149145                        'meta'      => array( 
     
    165161                        'title'  => $user_info, 
    166162                        'href'   => $profile_url, 
    167163                        'meta'   => array( 
    168                                 'class' => 'user-info user-info-item', 
    169164                                'tabindex' => -1 
    170165                        ), 
    171166                ) ); 
     
    174169                        'id'     => 'edit-profile', 
    175170                        'title'  => __( 'Edit My Profile' ), 
    176171                        'href' => $profile_url, 
    177                         'meta'   => array( 
    178                                 'class' => 'user-info-item', 
    179                         ), 
    180172                ) ); 
    181173                $wp_admin_bar->add_menu( array( 
    182174                        'parent' => 'my-account', 
    183175                        'id'     => 'logout', 
    184176                        'title'  => __( 'Log Out' ), 
    185177                        'href'   => wp_logout_url(), 
    186                         'meta'   => array( 
    187                                 'class' => 'user-info-item', 
    188                         ), 
    189178                ) ); 
    190179        } 
    191180} 
     
    276265        ) ); 
    277266 
    278267        if ( is_super_admin() ) { 
     268                $wp_admin_bar->add_group( array( 
     269                        'parent' => 'my-sites', 
     270                        'id'     => 'my-sites-super-admin', 
     271                ) ); 
     272 
    279273                $wp_admin_bar->add_menu( array( 
    280                         'parent' => 'my-sites', 
     274                        'parent' => 'my-sites-super-admin', 
    281275                        'id'     => 'network-admin', 
    282276                        'title'  => __('Network Admin'), 
    283277                        'href'   => network_admin_url(), 
     
    309303                ) ); 
    310304        } 
    311305 
    312         // Add blog links 
     306        // Add site links 
     307        $wp_admin_bar->add_group( array( 
     308                'parent' => 'my-sites', 
     309                'id'     => 'my-sites-list', 
     310                'meta'   => array( 
     311                        'class' => is_super_admin() ? 'ab-sub-secondary' : '', 
     312                ), 
     313        ) ); 
     314 
    313315        $blue_wp_logo_url = includes_url('images/wpmini-blue.png'); 
    314316 
    315317        foreach ( (array) $wp_admin_bar->user->blogs as $blog ) { 
     
    321323                $menu_id  = 'blog-' . $blog->userblog_id; 
    322324 
    323325                $wp_admin_bar->add_menu( array( 
    324                         'parent'    => 'my-sites', 
    325                         'secondary' => is_super_admin(), 
     326                        'parent'    => 'my-sites-list', 
    326327                        'id'        => $menu_id, 
    327328                        'title'     => $blavatar . $blogname, 
    328329                        'href'      => get_admin_url( $blog->userblog_id ), 
     
    480481        } 
    481482 
    482483        if ( current_user_can( 'create_users' ) || current_user_can( 'promote_users' ) ) 
    483                 $actions[ 'user-new.php' ] = array( _x( 'User', 'add new from admin bar' ), 'new-user', true ); 
     484                $actions[ 'user-new.php' ] = array( _x( 'User', 'add new from admin bar' ), 'new-user', 'new-secondary-object' ); 
    484485 
    485486        if ( ! $actions ) 
    486487                return; 
     
    493494 
    494495        foreach ( $actions as $link => $action ) { 
    495496                list( $title, $id ) = $action; 
    496                 $secondary = ! empty( $action[2] ); 
     497                $parent = empty( $action[2] ) ? 'new-content' : $action[2]; 
    497498 
    498499                $wp_admin_bar->add_menu( array( 
    499                         'parent'    => 'new-content', 
    500                         'secondary' => $secondary, 
     500                        'parent'    => $parent, 
    501501                        'id'        => $id, 
    502502                        'title'     => $title, 
    503503                        'href'      => admin_url( $link ) 
     
    599599} 
    600600 
    601601/** 
     602 * Add secondary menus. 
     603 * 
     604 * @since 3.3.0 
     605 */ 
     606function wp_admin_bar_add_secondary_groups( $wp_admin_bar ) { 
     607        $wp_admin_bar->add_group( array( 
     608                'id'     => 'top-secondary', 
     609                'meta'   => array( 
     610                        'class' => 'ab-top-secondary', 
     611                ), 
     612        ) ); 
     613 
     614        $wp_admin_bar->add_group( array( 
     615                'parent' => 'wp-logo', 
     616                'id'     => 'wp-logo-external', 
     617                'meta'   => array( 
     618                        'class' => 'ab-sub-secondary', 
     619                ), 
     620        ) ); 
     621 
     622        $wp_admin_bar->add_group( array( 
     623                'parent' => 'new-content', 
     624                'id'     => 'new-secondary-object', 
     625                'meta'   => array( 
     626                        'class' => 'ab-sub-secondary', 
     627                ), 
     628        ) ); 
     629} 
     630 
     631/** 
    602632 * Style and scripts for the admin bar. 
    603633 * 
    604634 * @since 3.1.0 
  • wp-includes/css/admin-bar-rtl.dev.css

     
    107107/** 
    108108 * My Account 
    109109 */ 
    110 #wpadminbar #wp-admin-bar-my-account.with-avatar .user-info-item { 
     110#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-my-account-default > li { 
    111111        margin-right: 88px; 
    112112        margin-left: 16px; 
    113113} 
    114114 
    115 #wpadminbar #wp-admin-bar-my-account .user-info-item > a { 
     115#wp-admin-bar-my-account-default > li > .ab-item { 
    116116        padding-left: 0; 
    117117        padding-right: 8px; 
    118118} 
    119119 
    120 #wp-admin-bar-my-account .user-info .avatar { 
     120#wp-admin-bar-user-info .avatar { 
    121121        left: auto; 
    122122        right: -72px; 
    123123} 
  • wp-includes/css/admin-bar.dev.css

     
    135135        margin: 0 -1px 0 0; 
    136136} 
    137137 
     138#wpadminbar .ab-sub-wrapper > .ab-submenu:first-child { 
     139        border-top: none; 
     140} 
     141 
    138142#wpadminbar .ab-submenu { 
    139143        padding: 6px 0; 
     144        border-top: 1px solid #dfdfdf; 
    140145} 
    141146 
    142147#wpadminbar .selected .shortlink-input { 
     
    247252        position: relative; 
    248253        right: auto; 
    249254        margin: 0; 
    250         border: 0; 
    251255 
    252256        background: #eee; 
    253         border-top: 1px solid #dfdfdf; 
    254257 
    255258        -moz-box-shadow: none; 
    256259        -webkit-box-shadow: none; 
     
    310313        min-width: 270px; 
    311314} 
    312315 
    313 #wpadminbar #wp-admin-bar-my-account .user-info-item { 
     316#wpadminbar #wp-admin-bar-my-account-default > li { 
    314317        margin-left: 16px; 
    315318        margin-right: 16px; 
    316319} 
    317320 
    318 #wpadminbar #wp-admin-bar-my-account.with-avatar .user-info-item { 
     321#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-my-account-default > li { 
    319322        margin-left: 88px; 
    320323} 
    321324 
    322 #wpadminbar #wp-admin-bar-my-account .user-info-item > a { 
     325#wp-admin-bar-my-account-default > li > .ab-item { 
    323326        padding-left: 8px; 
    324327} 
    325328 
    326 #wpadminbar #wp-admin-bar-my-account .user-info { 
     329#wpadminbar #wp-admin-bar-user-info { 
    327330        margin-top: 6px; 
    328331        margin-bottom: 15px; 
    329332        height: auto; 
    330333        background: none; 
    331334} 
    332335 
    333 #wp-admin-bar-my-account .user-info .avatar { 
     336#wp-admin-bar-user-info .avatar { 
    334337        position: absolute; 
    335338        left: -72px; 
    336339        top: 4px; 
    337340} 
    338341 
    339 #wpadminbar #wp-admin-bar-my-account .user-info a { 
     342#wpadminbar #wp-admin-bar-user-info a { 
    340343        height: auto; 
    341344} 
    342345 
    343 #wpadminbar #wp-admin-bar-my-account .user-info span { 
     346#wpadminbar #wp-admin-bar-user-info span { 
    344347        background: none; 
    345348        padding: 0; 
    346349        height: 18px; 
    347350} 
    348351 
    349 #wpadminbar #wp-admin-bar-my-account .user-info .display-name, 
    350 #wpadminbar #wp-admin-bar-my-account .user-info .username { 
     352#wpadminbar #wp-admin-bar-user-info .display-name, 
     353#wpadminbar #wp-admin-bar-user-info .username { 
    351354        text-shadow: none; 
    352355        display: block; 
    353356} 
    354 #wpadminbar #wp-admin-bar-my-account .user-info .display-name { 
     357#wpadminbar #wp-admin-bar-user-info .display-name { 
    355358        color: #333; 
    356359} 
    357360 
    358 #wpadminbar #wp-admin-bar-my-account .user-info .username { 
     361#wpadminbar #wp-admin-bar-user-info .username { 
    359362        color: #999; 
    360363        font-size: 11px; 
    361364} 
  • wp-includes/class-wp-admin-bar.php

     
    1212                        $this->proto = 'https://'; 
    1313 
    1414                $this->user = new stdClass; 
    15                 $this->root = new stdClass; 
    16                 $this->root->children  = (object) array( 
    17                         'primary'   => array(), 
    18                         'secondary' => array(), 
     15                $this->root = (object) array( 
     16                        'id'       => 'root', 
     17                        'group'    => false, 
     18                        'children' => array(), 
    1919                ); 
    2020 
    2121                if ( is_user_logged_in() ) { 
     
    6868         * - title      - string    - The title of the node. 
    6969         * - parent     - string    - The ID of the parent node. Optional. 
    7070         * - href       - string    - The link for the item. Optional. 
    71          * - secondary  - boolean   - If the item should be part of a secondary menu. Optional. Default false. 
     71         * - group      - boolean   - If the node is a group. Optional. Default false. 
    7272         * - meta       - array     - Meta data including the following keys: html, class, onclick, target, title. 
    7373         */ 
    7474        public function add_node( $args ) { 
     
    7777                        $args = array_merge( array( 'parent' => func_get_arg(0) ), func_get_arg(2) ); 
    7878 
    7979                // Ensure we have a valid title. 
    80                 if ( empty( $args['title'] ) ) 
    81                         return false; 
     80                if ( empty( $args['id'] ) ) { 
     81                        if ( empty( $args['title'] ) ) 
     82                                return; 
    8283 
    83                 if ( empty( $args['id'] ) ) { 
    8484                        _doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3' ); 
     85                        // Deprecated: Generate an ID from the title. 
    8586                        $args['id'] = esc_attr( sanitize_title( trim( $args['title'] ) ) ); 
    8687                } 
    8788 
    8889                $defaults = array( 
    89                         'id'        => false, 
    90                         'title'     => false, 
    91                         'parent'    => false, 
    92                         'href'      => false, 
    93                         'secondary' => false, 
    94                         'meta'      => array(), 
     90                        'id'     => false, 
     91                        'title'  => false, 
     92                        'parent' => false, 
     93                        'href'   => false, 
     94                        'group' => false, 
     95                        'meta'   => array(), 
    9596                ); 
    9697 
    9798                // If the node already exists, keep any data that isn't provided. 
     
    99100                        $defaults = (array) $this->nodes[ $args['id'] ]; 
    100101 
    101102                $args = wp_parse_args( $args, $defaults ); 
    102                 $args['children'] = (object) array( 
    103                         'primary'   => array(), 
    104                         'secondary' => array(), 
    105                 ); 
     103                $args['children'] = array(); 
    106104 
    107105                $this->nodes[ $args['id'] ] = (object) $args; 
    108106        } 
    109107 
     108        /** 
     109         * Add a group to a menu node. 
     110         * 
     111         * @param array $args - The arguments for each node. 
     112         * - id         - string    - The ID of the item. 
     113         * - parent     - string    - The ID of the parent node. Optional. Default root. 
     114         * - meta       - array     - Meta data including the following keys: class, onclick, target, title. 
     115         */ 
     116        public function add_group( $args ) { 
     117                $args['group'] = true; 
     118 
     119                $this->add_node( $args ); 
     120        } 
     121 
    110122        public function remove_node( $id ) { 
    111123                unset( $this->nodes[ $id ] ); 
    112124        } 
     
    136148                                $parent = $this->nodes[ $node->parent ]; 
    137149                        } 
    138150 
    139                         if ( $node->secondary ) 
    140                                 $parent->children->secondary[] = $node; 
    141                         else 
    142                                 $parent->children->primary[] = $node; 
     151 
     152                        // Ensure that our tree is of the form "item -> group -> item -> group -> ..." 
     153                        if ( ! $parent->group && ! $node->group ) { // Both are items. 
     154                                // The default group is added here to allow groups that are 
     155                                // added before standard menu items to render first. 
     156                                if ( ! isset( $parent->children['default'] ) ) { 
     157                                        $parent->children['default'] = (object) array( 
     158                                                'id'       => "{$parent->id}-default", 
     159                                                'parent'   => $parent->id, 
     160                                                'group'    => true, 
     161                                                'children' => array(), 
     162                                        ); 
     163                                } 
     164                                $parent = $parent->children['default']; 
     165                        } 
     166 
     167                        // Update the parent ID (it might have changed). 
     168                        $node->parent = $parent->id; 
     169 
     170                        // Add the node to the tree. 
     171                        $parent->children[] = $node; 
    143172                } 
    144173 
    145174                // Add browser classes. 
     
    159188                ?> 
    160189                <div id="wpadminbar" class="<?php echo $class; ?>"> 
    161190                        <div class="quicklinks"> 
    162                                 <ul class="ab-top-menu"><?php 
    163  
    164                                         foreach ( $this->root->children->primary as $node ) { 
    165                                                 $this->recursive_render( $node ); 
    166                                         } 
    167  
    168                                 ?></ul> 
    169                                 <ul class="ab-top-menu ab-top-secondary"><?php 
    170  
    171                                         foreach ( $this->root->children->secondary as $node ) { 
    172                                                 $this->recursive_render( $node ); 
    173                                         } 
    174  
    175                                 ?></ul> 
     191                                <?php foreach ( $this->root->children as $group ) { 
     192                                        $this->render_group( $group, 'ab-top-menu' ); 
     193                                } ?> 
    176194                        </div> 
    177195                </div> 
    178196 
    179197                <?php 
    180198        } 
    181199 
    182         function recursive_render( $node ) { 
    183                 if ( ! $node->children->primary && $node->children->secondary ) { 
    184                         $node->children->primary = $node->children->secondary; 
    185                         $node->children->secondary = array(); 
     200        private function render_group( $node, $class = '' ) { 
     201                if ( ! $node->group ) 
     202                        return; 
     203 
     204                // Check for groups within groups. 
     205                $groups = array(); 
     206                foreach ( $node->children as $child ) { 
     207                        if ( $child->group ) { 
     208                                $groups[] = $child; 
     209                        } else { 
     210                                if ( ! isset( $default ) ) { 
     211                                        // Create a default proxy item to be used in the case of nested groups. 
     212                                        $default  = (object) wp_parse_args( array( 'children' => array() ), (array) $node ); 
     213                                        $groups[] = $default; 
     214                                } 
     215                                $default->children[] = $child; 
     216                        } 
    186217                } 
    187218 
    188                 $is_parent = (bool) $node->children->primary; 
     219                $is_single_group = count( $groups ) === 1; 
     220 
     221 
     222                // If we don't have any subgroups, render the group. 
     223                if ( $is_single_group && ! empty( $node->children ) ): 
     224 
     225                        if ( ! empty( $node->meta['class'] ) ) 
     226                                $class .= ' ' . $node->meta['class']; 
     227 
     228                        ?><ul id="<?php echo esc_attr( "wp-admin-bar-{$node->id}" ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php 
     229                                foreach ( $node->children as $item ) { 
     230                                        $this->render_item( $item ); 
     231                                } 
     232                        ?></ul><?php 
     233 
     234                // Wrap the subgroups in a div and render each individual subgroup. 
     235                elseif ( ! $is_single_group ): 
     236                        ?><div id="<?php echo esc_attr( "wp-admin-bar-{$node->id}-container" ); ?>" class="ab-group-container"><?php 
     237                                foreach ( $groups as $group ) { 
     238                                        $this->render_group( $group, $class ); 
     239                                } 
     240                        ?></div><?php 
     241                endif; 
     242        } 
     243 
     244        private function render_item( $node ) { 
     245                if ( $node->group ) 
     246                        return; 
     247 
     248                $is_parent = (bool) $node->children; 
    189249                $has_link  = (bool) $node->href; 
    190250 
    191251                $menuclass = $is_parent ? 'menupop' : ''; 
     
    222282 
    223283                        if ( $is_parent ) : 
    224284                                ?><div class="ab-sub-wrapper"><?php 
    225  
    226                                         // Render primary submenu 
    227                                         ?><ul class="ab-submenu"><?php 
    228                                         foreach ( $node->children->primary as $child_node ) { 
    229                                                 $this->recursive_render( $child_node ); 
     285                                        foreach ( $node->children as $group ) { 
     286                                                $this->render_group( $group, 'ab-submenu' ); 
    230287                                        } 
    231                                         ?></ul><?php 
    232  
    233                                         // Render secondary submenu 
    234                                         if ( ! empty( $node->children->secondary ) ): 
    235                                                 ?><ul class="ab-submenu ab-sub-secondary"><?php 
    236                                                 foreach ( $node->children->secondary as $child_node ) { 
    237                                                         $this->recursive_render( $child_node ); 
    238                                                 } 
    239                                                 ?></ul><?php 
    240                                         endif; 
    241  
    242288                                ?></div><?php 
    243289                        endif; 
    244290 
     
    247293 
    248294                        ?> 
    249295                </li><?php 
     296        } 
    250297 
     298        function recursive_render( $node ) { 
     299                $this->render_item( $node ); 
    251300        } 
    252301 
    253302        function add_menus() { 
     
    271320                if ( ! is_admin() ) 
    272321                        add_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 100 ); 
    273322 
     323                add_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 ); 
     324 
    274325                do_action( 'add_admin_bar_menus' ); 
    275326        } 
    276327}