Skip to:
Content

BuddyPress.org

Changeset 11818


Ignore:
Timestamp:
01/25/2018 07:44:54 PM (3 years ago)
Author:
dcavins
Message:

Use WP functions to retrieve user data.

Use WP functions to retrieve user name, display name, nicename, and email.

Switch functions like bp_core_get_username() to use native WordPress functions. This also removes the need for maintaining redundant cached items, like caching individual usernames, and instead relies upon WP's userdata cache.

Props dcavins, djpaul.

Fixes #7661.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-core/classes/class-bp-core-user.php

    r11705 r11818  
    166166            $this->email     = esc_attr( bp_core_get_user_email( $this->id ) );
    167167        }
    168 
    169         // Cache a few things that are fetched often.
    170         wp_cache_set( 'bp_user_fullname_' . $this->id, $this->fullname, 'bp' );
    171         wp_cache_set( 'bp_user_email_' . $this->id, $this->email, 'bp' );
    172         wp_cache_set( 'bp_user_url_' . $this->id, $this->user_url, 'bp' );
    173168
    174169        $this->avatar       = bp_core_fetch_avatar( array( 'item_id' => $this->id, 'type' => 'full', 'alt' => sprintf( __( 'Profile photo of %s', 'buddypress' ), $this->fullname ) ) );
  • trunk/src/bp-members/bp-members-functions.php

    r11768 r11818  
    305305 * @param string|bool $user_nicename Optional. user_nicename of user being checked.
    306306 * @param string|bool $user_login    Optional. user_login of user being checked.
    307  * @return string|bool The username of the matched user, or false.
     307 * @return string The username of the matched user or an empty string if no user is found.
    308308 */
    309309function bp_core_get_username( $user_id = 0, $user_nicename = false, $user_login = false ) {
    310     $bp = buddypress();
    311 
    312     // Check cache for user nicename.
    313     $username = wp_cache_get( 'bp_user_username_' . $user_id, 'bp' );
    314     if ( false === $username ) {
    315 
    316         // Cache not found so prepare to update it.
    317         $update_cache = true;
    318 
    319         // Nicename and login were not passed.
    320         if ( empty( $user_nicename ) && empty( $user_login ) ) {
    321 
    322             // User ID matches logged in user.
    323             if ( bp_loggedin_user_id() == $user_id ) {
    324                 $userdata = &$bp->loggedin_user->userdata;
    325 
    326             // User ID matches displayed in user.
    327             } elseif ( bp_displayed_user_id() == $user_id ) {
    328                 $userdata = &$bp->displayed_user->userdata;
    329 
    330             // No user ID match.
    331             } else {
    332                 $userdata = false;
    333             }
    334 
    335             // No match so go dig.
    336             if ( empty( $userdata ) ) {
    337 
    338                 // User not found so return false.
    339                 if ( !$userdata = bp_core_get_core_userdata( $user_id ) ) {
    340                     return false;
    341                 }
    342             }
    343 
    344             // Update the $user_id for later.
    345             $user_id       = $userdata->ID;
    346 
    347             // Two possible options.
    348             $user_nicename = $userdata->user_nicename;
    349             $user_login    = $userdata->user_login;
    350         }
    351 
     310
     311    if ( ! $user_nicename && ! $user_login ) {
    352312        // Pull an audible and maybe use the login over the nicename.
     313        if ( bp_is_username_compatibility_mode() ) {
     314            $username = get_the_author_meta( 'login', $user_id );
     315        } else {
     316            $username = get_the_author_meta( 'nicename', $user_id );
     317        }
     318    } else {
    353319        $username = bp_is_username_compatibility_mode() ? $user_login : $user_nicename;
    354 
    355     // Username found in cache so don't update it again.
    356     } else {
    357         $update_cache = false;
    358     }
    359 
    360     // Add this to cache.
    361     if ( ( true === $update_cache ) && !empty( $username ) ) {
    362         wp_cache_set( 'bp_user_username_' . $user_id, $username, 'bp' );
    363 
    364     // @todo bust this cache if no $username found?
    365     // } else {
    366     // wp_cache_delete( 'bp_user_username_' . $user_id );
    367320    }
    368321
     
    385338 * @since 1.5.0
    386339 *
    387  * @todo Refactor to use a WP core function, if possible.
    388  *
    389340 * @param int $user_id User ID to check.
    390  * @return string|bool The username of the matched user, or false.
     341 * @return string The username of the matched user or an empty string if no user is found.
    391342 */
    392343function bp_members_get_user_nicename( $user_id ) {
    393     $bp = buddypress();
    394 
    395     if ( !$user_nicename = wp_cache_get( 'bp_members_user_nicename_' . $user_id, 'bp' ) ) {
    396         $update_cache = true;
    397 
    398         // User ID matches logged in user.
    399         if ( bp_loggedin_user_id() == $user_id ) {
    400             $userdata = &$bp->loggedin_user->userdata;
    401 
    402         // User ID matches displayed in user.
    403         } elseif ( bp_displayed_user_id() == $user_id ) {
    404             $userdata = &$bp->displayed_user->userdata;
    405 
    406         // No user ID match.
    407         } else {
    408             $userdata = false;
    409         }
    410 
    411         // No match so go dig.
    412         if ( empty( $userdata ) ) {
    413 
    414             // User not found so return false.
    415             if ( !$userdata = bp_core_get_core_userdata( $user_id ) ) {
    416                 return false;
    417             }
    418         }
    419 
    420         // User nicename found.
    421         $user_nicename = $userdata->user_nicename;
    422 
    423     // Nicename found in cache so don't update it again.
    424     } else {
    425         $update_cache = false;
    426     }
    427 
    428     // Add this to cache.
    429     if ( true == $update_cache && !empty( $user_nicename ) ) {
    430         wp_cache_set( 'bp_members_user_nicename_' . $user_id, $user_nicename, 'bp' );
    431     }
    432 
    433344    /**
    434345     * Filters the user_nicename based on originally provided user ID.
     
    438349     * @param string $username User nice name determined by user ID.
    439350     */
    440     return apply_filters( 'bp_members_get_user_nicename', $user_nicename );
     351    return apply_filters( 'bp_members_get_user_nicename', get_the_author_meta( 'nicename', $user_id ) );
    441352}
    442353
     
    448359 * @param int $uid User ID to check.
    449360 * @return string The email for the matched user. Empty string if no user
    450  *                matched the $uid.
    451  */
    452 function bp_core_get_user_email( $uid ) {
    453 
    454     if ( !$email = wp_cache_get( 'bp_user_email_' . $uid, 'bp' ) ) {
    455 
    456         // User exists.
    457         $ud = bp_core_get_core_userdata( $uid );
    458         if ( ! empty( $ud ) ) {
    459             $email = $ud->user_email;
    460 
    461         // User was deleted.
    462         } else {
    463             $email = '';
    464         }
    465 
    466         wp_cache_set( 'bp_user_email_' . $uid, $email, 'bp' );
    467     }
    468 
     361 *                matches the $user_id.
     362 */
     363function bp_core_get_user_email( $user_id ) {
    469364    /**
    470365     * Filters the user email for user based on user ID.
     
    474369     * @param string $email Email determined for the user.
    475370     */
    476     return apply_filters( 'bp_core_get_user_email', $email );
     371    return apply_filters( 'bp_core_get_user_email', get_the_author_meta( 'email', $user_id ) );
    477372}
    478373
     
    533428 *
    534429 * @param array $user_ids Array of user IDs to get display names for.
    535  * @return array
     430 * @return array Associative array of the format "id" => "displayname".
    536431 */
    537432function bp_core_get_user_displaynames( $user_ids ) {
     
    547442    }
    548443
    549     $uncached_ids = array();
    550     foreach ( $user_ids as $user_id ) {
    551         if ( false === wp_cache_get( 'bp_user_fullname_' . $user_id, 'bp' ) ) {
    552             $uncached_ids[] = $user_id;
    553         }
    554     }
    555 
    556     // Prime caches.
    557     if ( ! empty( $uncached_ids ) ) {
    558         if ( bp_is_active( 'xprofile' ) ) {
    559             $fullname_data = BP_XProfile_ProfileData::get_value_byid( 1, $uncached_ids );
    560 
    561             // Key by user_id.
    562             $fullnames = array();
    563             foreach ( $fullname_data as $fd ) {
    564                 if ( ! empty( $fd->value ) ) {
    565                     $fullnames[ intval( $fd->user_id ) ] = $fd->value;
    566                 }
    567             }
    568 
    569             // If xprofiledata is not found for any users,  we'll look
    570             // them up separately.
    571             $no_xprofile_ids = array_diff( $uncached_ids, array_keys( $fullnames ) );
    572         } else {
    573             $fullnames = array();
    574             $no_xprofile_ids = $user_ids;
    575         }
    576 
    577         if ( ! empty( $no_xprofile_ids ) ) {
    578             // Use WP_User_Query because we don't need BP information.
    579             $query = new WP_User_Query( array(
    580                 'include'     => $no_xprofile_ids,
    581                 'fields'      => array( 'ID', 'user_nicename', 'display_name', ),
    582                 'count_total' => false,
    583                 'blog_id'     => 0,
    584             ) );
    585 
    586             foreach ( $query->results as $qr ) {
    587                 $fullnames[ $qr->ID ] = ! empty( $qr->display_name ) ? $qr->display_name : $qr->user_nicename;
    588 
    589                 // If xprofile is active, set this value as the
    590                 // xprofile display name as well.
    591                 if ( bp_is_active( 'xprofile' ) ) {
    592                     xprofile_set_field_data( 1, $qr->ID, $fullnames[ $qr->ID ] );
    593                 }
    594             }
    595         }
    596 
    597         foreach ( $fullnames as $fuser_id => $fname ) {
    598             wp_cache_set( 'bp_user_fullname_' . $fuser_id, $fname, 'bp' );
    599         }
    600     }
     444    // Warm the WP users cache with a targeted bulk update.
     445    cache_users( $user_ids );
    601446
    602447    $retval = array();
    603448    foreach ( $user_ids as $user_id ) {
    604         $retval[ $user_id ] = wp_cache_get( 'bp_user_fullname_' . $user_id, 'bp' );
     449        $retval[ $user_id ] = bp_core_get_user_displayname( $user_id );
    605450    }
    606451
     
    632477    }
    633478
    634     $display_names = bp_core_get_user_displaynames( array( $user_id ) );
    635 
    636     if ( ! isset( $display_names[ $user_id ] ) ) {
    637         $fullname = false;
    638     } else {
    639         $fullname = $display_names[ $user_id ];
    640     }
    641 
    642479    /**
    643480     * Filters the display name for the passed in user.
     
    648485     * @param int    $user_id  ID of the user to check.
    649486     */
    650     return apply_filters( 'bp_core_get_user_displayname', $fullname, $user_id );
     487    return apply_filters( 'bp_core_get_user_displayname', get_the_author_meta( 'display_name', $user_id ), $user_id );
    651488}
    652489add_filter( 'bp_core_get_user_displayname', 'strip_tags', 1 );
  • trunk/src/bp-xprofile/bp-xprofile-cache.php

    r11352 r11818  
    189189add_action( 'xprofile_group_after_delete', 'xprofile_clear_profile_groups_object_cache' );
    190190add_action( 'xprofile_group_after_save',   'xprofile_clear_profile_groups_object_cache' );
    191 
    192 /**
    193  * Clear cached XProfile fullname data for user.
    194  *
    195  * @since 2.1.0
    196  *
    197  * @param int $user_id ID of user whose fullname cache to delete.
    198  */
    199 function xprofile_clear_profile_data_object_cache( $user_id = 0 ) {
    200     wp_cache_delete( 'bp_user_fullname_' . $user_id, 'bp' );
    201 }
    202 add_action( 'xprofile_updated_profile', 'xprofile_clear_profile_data_object_cache' );
    203 
    204 /**
    205  * Clear the fullname cache when field 1 is updated.
    206  *
    207  * The xprofile_clear_profile_data_object_cache() will make this redundant in most
    208  * cases, except where the field is updated directly with xprofile_set_field_data().
    209  *
    210  * @since 2.0.0
    211  *
    212  * @param object $data Data object to clear.
    213  */
    214 function xprofile_clear_fullname_cache_on_profile_field_edit( $data ) {
    215     if ( 1 == $data->field_id ) {
    216         wp_cache_delete( 'bp_user_fullname_' . $data->user_id, 'bp' );
    217     }
    218 }
    219 add_action( 'xprofile_data_after_save', 'xprofile_clear_fullname_cache_on_profile_field_edit' );
    220191
    221192/**
  • trunk/tests/phpunit/testcases/members/functions.php

    r11747 r11818  
    102102    /**
    103103     * @group bp_core_get_user_displayname
    104      * @group cache
    105      */
    106     public function test_bp_core_get_user_displayname_xprofile_populate_cache() {
    107         $xprofile_is_active = bp_is_active( 'xprofile' );
    108         buddypress()->active_components['xprofile'] = '1';
    109 
    110         $u = self::factory()->user->create( array(
    111             'display_name' => 'Foo',
    112         ) );
    113         bp_core_get_user_displayname( $u );
    114 
    115         $this->assertSame( 'Foo', wp_cache_get( 'bp_user_fullname_' . $u, 'bp' ) );
    116 
    117         if ( ! $xprofile_is_active ) {
    118             unset( buddypress()->active_components['xprofile'] );
    119         }
    120     }
    121 
    122     /**
    123      * @group bp_core_get_user_displayname
    124      * @group cache
    125      */
    126     public function test_bp_core_get_user_displayname_xprofile_bust_cache_after_xprofile_update() {
    127         $xprofile_is_active = bp_is_active( 'xprofile' );
    128         buddypress()->active_components['xprofile'] = '1';
    129 
    130         $u = self::factory()->user->create();
    131         xprofile_set_field_data( 1, $u, 'Foo Foo' );
    132 
    133         $this->assertFalse( wp_cache_get( 'bp_user_fullname_' . $u, 'bp' ) );
    134 
    135         if ( ! $xprofile_is_active ) {
    136             unset( buddypress()->active_components['xprofile'] );
    137         }
    138     }
    139 
    140     /**
    141      * @group bp_core_get_user_displayname
    142104     */
    143105    public function test_bp_core_get_user_displayname_xprofile_exists() {
     
    156118
    157119    /**
    158      * @group bp_core_get_user_displayname
    159      */
    160     public function test_bp_core_get_user_displayname_xprofile_does_not_exist() {
    161         $bp = buddypress();
    162         $xprofile_is_active = bp_is_active( 'xprofile' );
    163         $bp->active_components['xprofile'] = '1';
    164 
    165         $u = self::factory()->user->create( array(
    166             'display_name' => 'Foo Foo',
    167         ) );
    168 
    169         // Delete directly because BP won't let you delete a required
    170         // field through the API
    171         global $wpdb;
    172         $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->profile->table_name_data} WHERE user_id = %d AND field_id = 1", $u ) );
    173         wp_cache_delete( 'bp_user_fullname_' . $u, 'bp' );
    174         wp_cache_delete( "{$u}:1", 'bp_xprofile_data' );
    175 
    176         $this->assertSame( '', xprofile_get_field_data( 1, $u ) );
    177         $this->assertSame( 'Foo Foo', bp_core_get_user_displayname( $u ) );
    178         $this->assertSame( 'Foo Foo', xprofile_get_field_data( 1, $u ) );
    179 
    180         if ( ! $xprofile_is_active ) {
    181             unset( $bp->active_components['xprofile'] );
    182         }
    183     }
    184 
    185     /**
    186120     * @group bp_core_get_user_displaynames
    187121     */
     
    196130        $u1 = self::factory()->user->create();
    197131        $u2 = self::factory()->user->create();
    198 
    199132        xprofile_set_field_data( 1, $u1, 'Foo' );
    200133        xprofile_set_field_data( 1, $u2, 'Bar' );
     
    216149            'display_name' => 'Bar',
    217150        ) );
    218 
    219151        xprofile_set_field_data( 1, $u1, 'Foo' );
    220 
    221         // Delete directly because BP won't let you delete a required
    222         // field through the API
    223         global $wpdb;
    224         $bp = buddypress();
    225         $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->profile->table_name_data} WHERE user_id = %d AND field_id = 1", $u2 ) );
    226         wp_cache_delete( 'bp_user_fullname_' . $u2, 'bp' );
    227         wp_cache_delete( "{$u2}:1", 'bp_xprofile_data' );
    228 
    229         $expected = array(
    230             $u1 => 'Foo',
    231             $u2 => 'Bar',
    232         );
    233 
    234         $this->assertSame( $expected, bp_core_get_user_displaynames( array( $u1, $u2, ) ) );
    235     }
    236 
    237     /**
    238      * @group bp_core_get_user_displaynames
    239      */
    240     public function test_bp_core_get_user_displaynames_one_in_cache() {
    241         $u1 = self::factory()->user->create();
    242         xprofile_set_field_data( 1, $u1, 'Foo' );
    243 
    244         // Fake the cache for $u2
    245         $u2 = 123;
    246         wp_cache_set( 'bp_user_fullname_' . $u2, 'Bar', 'bp' );
    247152
    248153        $expected = array(
Note: See TracChangeset for help on using the changeset viewer.