[wp-trac] [WordPress Trac] #54984: wp_update_user doesn't work properly with current user instance

WordPress Trac noreply at wordpress.org
Thu Mar 10 03:12:36 UTC 2022

#54984: wp_update_user doesn't work properly with current user instance
 Reporter:  oztaser       |       Owner:  (none)
     Type:  defect (bug)  |      Status:  new
 Priority:  normal        |   Milestone:  6.0
Component:  Users         |     Version:
 Severity:  normal        |  Resolution:
 Keywords:                |     Focuses:

Comment (by peterwilsoncc):

 Thanks for providing an mu-plugin as a proof of concept, @oztaser, it was
 a great help.

 The bug seems to be caused by the combination of two things:
 * objects are passed by reference
 * since 5.8 WP has used the same user object for the current user whenever

 The result is that in this block of code, the old user data object is no
 such thing: it's simply a reference to the modified object that has been
 passed to the function.


 // In `wp_update_user()`

 // First, get all of the original fields.
 $user_obj = get_userdata( $user_id );
 if ( ! $user_obj ) {
         return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' )

 /wp-includes/user.php#L2350-L2354 reference]


 In [attachment:"54984.diff"] I've worked around this by creating a new
 `WP_User` object for the purpose of obtaining the old data.

 However, I am not sure this is an ideal solution as `get_userdata()` and
 related functions are pluggable so there is no way of knowing if the data
 returned by `new WP_User( $user_id )` is what is returned by

 A technique to force an uncached copy of the user data is what is needed
 to fix this though.

Ticket URL: <https://core.trac.wordpress.org/ticket/54984#comment:4>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform

More information about the wp-trac mailing list