Make WordPress Core

Ticket #25162: 25162.4.diff

File 25162.4.diff, 10.7 KB (added by johnbillion, 9 years ago)
  • tests/phpunit/tests/adminbar.php

     
    1515        function setUp() {
    1616                parent::setUp();
    1717                $this->current_user = get_current_user_id();
    18                 wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
    1918        }
    2019
    2120        function tearDown() {
     
    2726         * @ticket 21117
    2827         */
    2928        function test_content_post_type() {
     29                wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
     30
    3031                register_post_type( 'content', array( 'show_in_admin_bar' => true ) );
    3132
    3233                $admin_bar = new WP_Admin_Bar;
     
    4445         * @ticket 21117
    4546         */
    4647        function test_merging_existing_meta_values() {
     48                wp_set_current_user( $this->factory->user->create( array( 'role' => 'editor' ) ) );
     49
    4750                $admin_bar = new WP_Admin_Bar;
    4851
    4952                $admin_bar->add_node( array(
     
    6164                $node = $admin_bar->get_node( 'test-node' );
    6265                $this->assertEquals( array( 'class' => 'test-class', 'some-meta' => 'value' ), $node->meta );
    6366        }
    64 }
    65  No newline at end of file
     67
     68        /**
     69         * @ticket 25162
     70         */
     71        public function test_admin_bar_contains_correct_links_for_users_with_no_role() {
     72                if ( is_multisite() ) {
     73                        $this->markTestSkipped( 'Test does not run in multisite' );
     74                }
     75
     76                $nobody = $this->factory->user->create( array( 'role' => '' ) );
     77                $this->assertFalse( user_can( $nobody, 'read' ) );
     78
     79                wp_set_current_user( $nobody );
     80
     81                $wp_admin_bar = $this->get_standard_admin_bar();
     82
     83                $node_site_name    = $wp_admin_bar->get_node( 'site-name' );
     84                $node_my_account   = $wp_admin_bar->get_node( 'my-account' );
     85                $node_user_info    = $wp_admin_bar->get_node( 'user-info' );
     86                $node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
     87
     88                // Site menu points to the home page instead of the admin URL
     89                $this->assertEquals( home_url( '/' ), $node_site_name->href );
     90
     91                // No profile links as the user doesn't have any permissions on the site
     92                $this->assertFalse( $node_my_account->href );
     93                $this->assertFalse( $node_user_info->href );
     94                $this->assertNull( $node_edit_profile );
     95
     96        }
     97
     98        /**
     99         * @ticket 25162
     100         */
     101        public function test_admin_bar_contains_correct_links_for_users_with_role() {
     102                if ( is_multisite() ) {
     103                        $this->markTestSkipped( 'Test does not run in multisite' );
     104                }
     105
     106                $editor = $this->factory->user->create( array( 'role' => 'editor' ) );
     107                $this->assertTrue( user_can( $editor, 'read' ) );
     108
     109                wp_set_current_user( $editor );
     110
     111                $wp_admin_bar = $this->get_standard_admin_bar();
     112
     113                $node_site_name    = $wp_admin_bar->get_node( 'site-name' );
     114                $node_my_account   = $wp_admin_bar->get_node( 'my-account' );
     115                $node_user_info    = $wp_admin_bar->get_node( 'user-info' );
     116                $node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
     117
     118                // Site menu points to the admin URL
     119                $this->assertEquals( admin_url( '/' ), $node_site_name->href );
     120
     121                $profile_url = admin_url( 'profile.php' );
     122
     123                // Profile URLs point to profile.php
     124                $this->assertEquals( $profile_url, $node_my_account->href );
     125                $this->assertEquals( $profile_url, $node_user_info->href );
     126                $this->assertEquals( $profile_url, $node_edit_profile->href );
     127
     128        }
     129
     130        /**
     131         * @ticket 25162
     132         * @group multisite
     133         */
     134        public function test_admin_bar_contains_correct_links_for_users_with_no_role_on_blog() {
     135                if ( ! is_multisite() ) {
     136                        $this->markTestSkipped( 'Test only runs in multisite' );
     137                }
     138
     139                $admin  = $this->factory->user->create( array( 'role' => 'administrator' ) );
     140                $editor = $this->factory->user->create( array( 'role' => 'editor' ) );
     141
     142                $this->assertTrue( user_can( $admin, 'read' ) );
     143                $this->assertTrue( user_can( $editor, 'read' ) );
     144
     145                $new_blog_id = $this->factory->blog->create( array(
     146                        'user_id' => $admin,
     147                ) );
     148
     149                $this->assertTrue( is_user_member_of_blog( $admin, $new_blog_id ) );
     150                $this->assertFalse( is_user_member_of_blog( $editor, $new_blog_id ) );
     151
     152                wp_set_current_user( $editor );
     153
     154                switch_to_blog( $new_blog_id );
     155
     156                $wp_admin_bar = $this->get_standard_admin_bar();
     157
     158                $node_site_name    = $wp_admin_bar->get_node( 'site-name' );
     159                $node_my_account   = $wp_admin_bar->get_node( 'my-account' );
     160                $node_user_info    = $wp_admin_bar->get_node( 'user-info' );
     161                $node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
     162
     163                // get primary blog
     164                $primary = get_active_blog_for_user( $editor );
     165                $this->assertInternalType( 'object', $primary );
     166
     167                // No Site menu as the user isn't a member of this blog
     168                $this->assertNull( $node_site_name );
     169
     170                $primary_profile_url = get_admin_url( $primary->blog_id, 'profile.php' );
     171
     172                // Ensure the user's primary blog is not the same as the main site
     173                $this->assertNotEquals( $primary_profile_url, admin_url( 'profile.php' ) );
     174
     175                // Profile URLs should go to the user's primary blog
     176                $this->assertEquals( $primary_profile_url, $node_my_account->href );
     177                $this->assertEquals( $primary_profile_url, $node_user_info->href );
     178                $this->assertEquals( $primary_profile_url, $node_edit_profile->href );
     179
     180                restore_current_blog();
     181
     182        }
     183
     184        /**
     185         * @ticket 25162
     186         * @group multisite
     187         */
     188        public function test_admin_bar_contains_correct_links_for_users_with_no_role_on_network() {
     189                if ( ! is_multisite() ) {
     190                        $this->markTestSkipped( 'Test only runs in multisite' );
     191                }
     192
     193                $admin  = $this->factory->user->create( array( 'role' => 'administrator' ) );
     194                $nobody = $this->factory->user->create( array( 'role' => '' ) );
     195
     196                $this->assertTrue( user_can( $admin, 'read' ) );
     197                $this->assertFalse( user_can( $nobody, 'read' ) );
     198
     199                $new_blog_id = $this->factory->blog->create( array(
     200                        'user_id' => $admin,
     201                ) );
     202
     203                $this->assertTrue( is_user_member_of_blog( $admin, $new_blog_id ) );
     204                $this->assertFalse( is_user_member_of_blog( $nobody, $new_blog_id ) );
     205                $this->assertTrue( is_user_member_of_blog( $nobody, get_current_blog_id() ) );
     206
     207                // Remove `$nobody` from the current blog, so they're not a member of any blog
     208                $removed = remove_user_from_blog( $nobody, get_current_blog_id() );
     209
     210                $this->assertTrue( $removed );
     211                $this->assertFalse( is_user_member_of_blog( $nobody, get_current_blog_id() ) );
     212
     213                wp_set_current_user( $nobody );
     214
     215                switch_to_blog( $new_blog_id );
     216
     217                $wp_admin_bar = $this->get_standard_admin_bar();
     218
     219                $node_site_name    = $wp_admin_bar->get_node( 'site-name' );
     220                $node_my_account   = $wp_admin_bar->get_node( 'my-account' );
     221                $node_user_info    = $wp_admin_bar->get_node( 'user-info' );
     222                $node_edit_profile = $wp_admin_bar->get_node( 'edit-profile' );
     223
     224                // get primary blog
     225                $primary = get_active_blog_for_user( $nobody );
     226                $this->assertNull( $primary );
     227
     228                // No Site menu as the user isn't a member of this site
     229                $this->assertNull( $node_site_name );
     230
     231                $user_profile_url = user_admin_url( 'profile.php' );
     232
     233                $this->assertNotEquals( $user_profile_url, admin_url( 'profile.php' ) );
     234
     235                // Profile URLs should go to the user's primary blog
     236                $this->assertEquals( $user_profile_url, $node_my_account->href );
     237                $this->assertEquals( $user_profile_url, $node_user_info->href );
     238                $this->assertEquals( $user_profile_url, $node_edit_profile->href );
     239
     240                restore_current_blog();
     241
     242        }
     243
     244        protected function get_standard_admin_bar() {
     245                global $wp_admin_bar;
     246
     247                _wp_admin_bar_init();
     248
     249                $this->assertTrue( is_admin_bar_showing() );
     250                $this->assertInstanceOf( 'WP_Admin_Bar', $wp_admin_bar );
     251
     252                do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) );
     253
     254                return $wp_admin_bar;
     255        }
     256
     257}
  • src/wp-includes/admin-bar.php

     
    179179function wp_admin_bar_my_account_item( $wp_admin_bar ) {
    180180        $user_id      = get_current_user_id();
    181181        $current_user = wp_get_current_user();
    182         $profile_url  = get_edit_profile_url( $user_id );
    183182
    184183        if ( ! $user_id )
    185184                return;
    186185
     186        if ( current_user_can( 'read' ) ) {
     187                $profile_url = get_edit_profile_url( $user_id );
     188        } elseif ( is_multisite() ) {
     189                $profile_url = get_dashboard_url( $user_id, 'profile.php' );
     190        } else {
     191                $profile_url = false;
     192        }
     193
    187194        $avatar = get_avatar( $user_id, 26 );
    188195        $howdy  = sprintf( __('Howdy, %1$s'), $current_user->display_name );
    189196        $class  = empty( $avatar ) ? '' : 'with-avatar';
     
    209216function wp_admin_bar_my_account_menu( $wp_admin_bar ) {
    210217        $user_id      = get_current_user_id();
    211218        $current_user = wp_get_current_user();
    212         $profile_url  = get_edit_profile_url( $user_id );
    213219
    214220        if ( ! $user_id )
    215221                return;
    216222
     223        if ( current_user_can( 'read' ) ) {
     224                $profile_url = get_edit_profile_url( $user_id );
     225        } elseif ( is_multisite() ) {
     226                $profile_url = get_dashboard_url( $user_id, 'profile.php' );
     227        } else {
     228                $profile_url = false;
     229        }
     230
    217231        $wp_admin_bar->add_group( array(
    218232                'parent' => 'my-account',
    219233                'id'     => 'user-actions',
     
    234248                        'tabindex' => -1,
    235249                ),
    236250        ) );
    237         $wp_admin_bar->add_menu( array(
    238                 'parent' => 'user-actions',
    239                 'id'     => 'edit-profile',
    240                 'title'  => __( 'Edit My Profile' ),
    241                 'href' => $profile_url,
    242         ) );
     251
     252        if ( false !== $profile_url ) {
     253                $wp_admin_bar->add_menu( array(
     254                        'parent' => 'user-actions',
     255                        'id'     => 'edit-profile',
     256                        'title'  => __( 'Edit My Profile' ),
     257                        'href'   => $profile_url,
     258                ) );
     259        }
     260
    243261        $wp_admin_bar->add_menu( array(
    244262                'parent' => 'user-actions',
    245263                'id'     => 'logout',
     
    281299        $wp_admin_bar->add_menu( array(
    282300                'id'    => 'site-name',
    283301                'title' => $title,
    284                 'href'  => is_admin() ? home_url( '/' ) : admin_url(),
     302                'href'  => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(),
    285303        ) );
    286304
    287305        // Create submenu items.
     
    304322                        ) );
    305323                }
    306324
    307         } else {
     325        } else if ( current_user_can( 'read' ) ) {
    308326                // We're on the front end, link to the Dashboard.
    309327                $wp_admin_bar->add_menu( array(
    310328                        'parent' => 'site-name',
  • src/wp-includes/css/admin-bar.css

     
    2727        font-family: Arial, sans-serif;
    2828}
    2929
     30#wpadminbar .ab-empty-item {
     31        cursor: default;
     32}
     33
     34#wpadminbar .ab-empty-item,
    3035#wpadminbar a.ab-item,
    3136#wpadminbar > #wp-toolbar span.ab-label,
    3237#wpadminbar > #wp-toolbar span.noticon {
     
    451456        font-size: 11px;
    452457}
    453458
     459#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,
    454460#wpadminbar #wp-admin-bar-my-account.with-avatar > a img {
    455461        width: auto;
    456462        height: 16px;
     
    464470        display: inline;
    465471}
    466472
     473#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,
    467474#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > a img {
    468475        width: auto;
    469476}