Users: Clear the user_meta cache when clean_user_cache function is called.

Unlike other clean cache functions like `clean_post_cache`, `clean_user_cache` did not also clear user meta caches. This is inconsistent and can result in some strange side effects. Update the `clean_user_cache` function to also clear user meta caches when called. 

Props dd32, spacedmonkey, peterwilsoncc.
Fixes #54316.

git-svn-id: https://develop.svn.wordpress.org/trunk@54940 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
spacedmonkey 2022-12-06 13:52:02 +00:00
parent 7a9ffd079d
commit 08dfd2b550
2 changed files with 82 additions and 0 deletions

View File

@ -1873,6 +1873,7 @@ function update_user_caches( $user ) {
*
* @since 3.0.0
* @since 4.4.0 'clean_user_cache' action was added.
* @since 6.2.0 User metadata caches are now cleared.
*
* @param WP_User|int $user User object or ID to be cleaned from the cache
*/
@ -1893,6 +1894,8 @@ function clean_user_cache( $user ) {
wp_cache_delete( $user->user_email, 'useremail' );
}
wp_cache_delete( $user->ID, 'user_meta' );
/**
* Fires immediately after the given user's cache is cleaned.
*

View File

@ -27,4 +27,83 @@ class Tests_Meta_UpdateMetadata extends WP_UnitTestCase {
$found = get_metadata( 'post', 123, 'foo\foo', true );
$this->assertSame( 'baz', $found );
}
/**
* @ticket 54316
*
* @group user
*
* @covers ::clean_user_cache
*
* @global wpdb $wpdb WordPress database abstraction object.
*/
public function test_clear_user_metadata_caches() {
global $wpdb;
$user_id = self::factory()->user->create();
update_metadata( 'user', $user_id, 'key', 'value1' );
$found = get_metadata( 'user', $user_id, 'key', true );
$this->assertSame( 'value1', $found );
// Simulate updating the DB from outside of WordPress.
$wpdb->update(
$wpdb->usermeta,
array(
'meta_value' => 'value2',
),
array(
'user_id' => $user_id,
'meta_key' => 'key',
)
);
// Clear the user caches.
clean_user_cache( $user_id );
// Verify metadata cache was cleared.
$found = get_metadata( 'user', $user_id, 'key', true );
$this->assertSame( 'value2', $found );
}
/**
* @ticket 54316
*
* @group user
*
* @covers ::clean_user_cache
*
* @global wpdb $wpdb WordPress database abstraction object.
*/
public function test_clear_post_metadata_caches() {
global $wpdb;
$post_id = self::factory()->post->create();
update_metadata( 'post', $post_id, 'key', 'value1' );
$found = get_metadata( 'post', $post_id, 'key', true );
$this->assertSame( 'value1', $found );
// Simulate updating the DB from outside of WordPress.
$wpdb->update(
$wpdb->postmeta,
array(
'meta_value' => 'value2',
),
array(
'post_id' => $post_id,
'meta_key' => 'key',
)
);
// Clear the post caches.
clean_post_cache( $post_id );
// Verify metadata cache was cleared.
$found = get_metadata( 'post', $post_id, 'key', true );
$this->assertSame( 'value2', $found );
}
}