Make WordPress Core

Changeset 34122


Ignore:
Timestamp:
09/14/2015 05:09:58 PM (9 years ago)
Author:
johnbillion
Message:

Update links to the user profile editing screen in the admin toolbar when the current logged in user has no role on the current site. Covers single site and Multisite and introduces tests.

Fixes #25162

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/admin-bar.php

    r33213 r34122  
    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;
     185
     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    }
    186193
    187194    $avatar = get_avatar( $user_id, 26 );
     
    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;
     222
     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    }
    216230
    217231    $wp_admin_bar->add_group( array(
     
    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',
     
    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
     
    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(
  • trunk/src/wp-includes/css/admin-bar.css

    r34011 r34122  
    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,
     
    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;
     
    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;
  • trunk/tests/phpunit/tests/adminbar.php

    r25002 r34122  
    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
     
    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
     
    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
     
    6265        $this->assertEquals( array( 'class' => 'test-class', 'some-meta' => 'value' ), $node->meta );
    6366    }
     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
    64257}
Note: See TracChangeset for help on using the changeset viewer.