diff --git a/src/wp-includes/class-wp-user.php b/src/wp-includes/class-wp-user.php index 5d57a996ff..4c206c25fd 100644 --- a/src/wp-includes/class-wp-user.php +++ b/src/wp-includes/class-wp-user.php @@ -324,6 +324,26 @@ class WP_User { $this->data->$key = $value; } + /** + * Magic method for unsetting a certain custom field + * + * @since 4.4.0 + */ + function __unset( $key ) { + if ( 'id' == $key ) { + _deprecated_argument( 'WP_User->id', '2.1', __( 'Use WP_User->ID instead.' ) ); + $key = 'ID'; + } + + if ( isset( $this->data->$key ) ) { + unset( $this->data->$key ); + } + + if ( isset( self::$back_compat_keys[ $key ] ) ) { + unset( self::$back_compat_keys[ $key ] ); + } + } + /** * Determine whether the user exists in the database. * diff --git a/tests/phpunit/tests/user.php b/tests/phpunit/tests/user.php index 9a3b9ab017..ff61749259 100644 --- a/tests/phpunit/tests/user.php +++ b/tests/phpunit/tests/user.php @@ -162,6 +162,46 @@ class Tests_User extends WP_UnitTestCase { } } + /** + * Test the magic __unset method + * + * @ticket 20043 + */ + public function test_user_unset() { + // New user + $user_id = $this->factory->user->create( array( 'role' => 'author' ) ); + $user = new WP_User( $user_id ); + + // Test custom fields + $user->customField = 123; + $this->assertEquals( $user->customField, 123 ); + unset( $user->customField ); + $this->assertFalse( isset( $user->customField ) ); + return $user; + } + + /** + * @depends test_user_unset + * @expectedDeprecated WP_User->id + * @ticket 20043 + */ + function test_user_unset_lowercase_id( $user ) { + // Test 'id' (lowercase) + unset( $user->id ); + return $user; + } + + /** + * @depends test_user_unset_lowercase_id + * @ticket 20043 + */ + function test_user_unset_uppercase_id( $user ) { + // Test 'ID' + $this->assertNotEmpty( $user->ID ); + unset( $user->ID ); + $this->assertEmpty( $user->ID ); + } + // Test meta property magic functions for property get/set/isset. function test_user_meta_properties() { global $wpdb;