WordPress.org

Make WordPress Core

Ticket #19136: groups.diff

File groups.diff, 12.4 KB (added by koopersmith, 6 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}
     
    278267        if ( is_super_admin() ) {
    279268                $wp_admin_bar->add_menu( array(
    280269                        'parent' => 'my-sites',
     270                        'id'     => 'my-sites-super-admin',
     271                        'group'  => true,
     272                ) );
     273
     274                $wp_admin_bar->add_menu( array(
     275                        'parent' => 'my-sites-super-admin',
    281276                        'id'     => 'network-admin',
    282277                        'title'  => __('Network Admin'),
    283278                        'href'   => network_admin_url(),
     
    309304                ) );
    310305        }
    311306
    312         // Add blog links
     307        // Add site links
     308        $wp_admin_bar->add_menu( array(
     309                'parent' => 'my-sites',
     310                'id'     => 'my-sites-list',
     311                'group'  => true,
     312                'meta'   => array(
     313                        'class' => is_super_admin() ? 'ab-sub-secondary' : '',
     314                ),
     315        ) );
     316
    313317        $blue_wp_logo_url = includes_url('images/wpmini-blue.png');
    314318
    315319        foreach ( (array) $wp_admin_bar->user->blogs as $blog ) {
     
    321325                $menu_id  = 'blog-' . $blog->userblog_id;
    322326
    323327                $wp_admin_bar->add_menu( array(
    324                         'parent'    => 'my-sites',
    325                         'secondary' => is_super_admin(),
     328                        'parent'    => 'my-sites-list',
    326329                        'id'        => $menu_id,
    327330                        'title'     => $blavatar . $blogname,
    328331                        'href'      => get_admin_url( $blog->userblog_id ),
     
    599602}
    600603
    601604/**
     605 * Add secondary menus.
     606 *
     607 * @since 3.3.0
     608 */
     609function wp_admin_bar_add_secondary_groups( $wp_admin_bar ) {
     610        $wp_admin_bar->add_menu( array(
     611                'id'     => 'top-secondary',
     612                'group'  => true,
     613                'meta'   => array(
     614                        'class' => 'ab-top-secondary',
     615                ),
     616        ) );
     617
     618        $wp_admin_bar->add_menu( array(
     619                'parent' => 'wp-logo',
     620                'id'     => 'wp-logo-external',
     621                'group'  => true,
     622                'meta'   => array(
     623                        'class' => 'ab-sub-secondary',
     624                ),
     625        ) );
     626
     627        // $wp_admin_bar->add_menu( array(
     628        //      'parent' => '',
     629        //      'id'     => '-secondary',
     630        //      'group'  => true,
     631        //      'meta'   => array(
     632        //              'class' => 'ab-sub-secondary',
     633        //      ),
     634        // ) );
     635}
     636
     637/**
    602638 * Style and scripts for the admin bar.
    603639 *
    604640 * @since 3.1.0
  • 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#wpadminbar #wp-admin-bar-my-account-default li > a {
    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() ) {
     
    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        }
     
    136134                                $parent = $this->nodes[ $node->parent ];
    137135                        }
    138136
    139                         if ( $node->secondary )
    140                                 $parent->children->secondary[] = $node;
    141                         else
    142                                 $parent->children->primary[] = $node;
     137
     138                        // Ensure that our tree is of the form "item -> group -> item -> group -> ..."
     139                        if ( ! $parent->group && ! $node->group ) { // Both are items.
     140                                // The default group is added here to allow groups that are
     141                                // added before standard menu items to render first.
     142                                if ( ! isset( $parent->children['default'] ) ) {
     143                                        $parent->children['default'] = (object) array(
     144                                                'id'       => "{$parent->id}-default",
     145                                                'parent'   => $parent->id,
     146                                                'group'    => true,
     147                                                'children' => array(),
     148                                        );
     149                                }
     150                                $parent = $parent->children['default'];
     151                        }
     152
     153                        // Update the parent ID (it might have changed).
     154                        $node->parent = $parent->id;
     155
     156                        // Add the node to the tree.
     157                        $parent->children[] = $node;
    143158                }
    144159
    145160                // Add browser classes.
     
    159174                ?>
    160175                <div id="wpadminbar" class="<?php echo $class; ?>">
    161176                        <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>
     177                                <?php foreach ( $this->root->children as $group ) {
     178                                        $this->render_group( $group, 'ab-top-menu' );
     179                                } ?>
    176180                        </div>
    177181                </div>
    178182
    179183                <?php
    180184        }
    181185
    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();
     186        private function render_group( $node, $class = '' ) {
     187                if ( ! $node->group )
     188                        return;
     189
     190                // Check for groups within groups.
     191                $groups = array();
     192                foreach ( $node->children as $child ) {
     193                        if ( $child->group ) {
     194                                $groups[] = $child;
     195                        } else {
     196                                if ( ! isset( $default ) ) {
     197                                        // Create a default proxy item to be used in the case of nested groups.
     198                                        $default  = (object) wp_parse_args( array( 'children' => array() ), (array) $node );
     199                                        $groups[] = $default;
     200                                }
     201                                $default->children[] = $child;
     202                        }
    186203                }
    187204
    188                 $is_parent = (bool) $node->children->primary;
     205                // If we don't have any subgroups, render the group.
     206                if ( count( $groups ) === 1 ):
     207
     208                        if ( ! empty( $node->meta['class'] ) )
     209                                $class .= ' ' . $node->meta['class'];
     210
     211                        ?><ul id="<?php echo esc_attr( "wp-admin-bar-{$node->id}" ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php
     212                                foreach ( $node->children as $item ) {
     213                                        $this->render_item( $item );
     214                                }
     215                        ?></ul><?php
     216
     217                // Wrap the subgroups in a div and render each individual subgroup.
     218                else:
     219                        ?><div id="<?php echo esc_attr( "wp-admin-bar-{$node->id}-container" ); ?>" class="ab-group-container"><?php
     220                                foreach ( $groups as $group ) {
     221                                        $this->render_group( $group, $class );
     222                                }
     223                        ?></div><?php
     224                endif;
     225        }
     226
     227        private function render_item( $node ) {
     228                if ( $node->group )
     229                        return;
     230
     231                $is_parent = (bool) $node->children;
    189232                $has_link  = (bool) $node->href;
    190233
    191234                $menuclass = $is_parent ? 'menupop' : '';
     
    222265
    223266                        if ( $is_parent ) :
    224267                                ?><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 );
     268                                        foreach ( $node->children as $group ) {
     269                                                $this->render_group( $group, 'ab-submenu' );
    230270                                        }
    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 
    242271                                ?></div><?php
    243272                        endif;
    244273
     
    247276
    248277                        ?>
    249278                </li><?php
     279        }
    250280
     281        function recursive_render( $node ) {
     282                $this->render_item( $node );
    251283        }
    252284
    253285        function add_menus() {
     
    271303                if ( ! is_admin() )
    272304                        add_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 100 );
    273305
     306                add_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 );
     307
    274308                do_action( 'add_admin_bar_menus' );
    275309        }
    276310}