Changeset 61037
- Timestamp:
- 10/21/2025 03:23:43 PM (4 months ago)
- Location:
- trunk
- Files:
-
- 4 edited
-
src/wp-includes/class-wp-user.php (modified) (18 diffs)
-
tests/phpunit/tests/user/capabilities.php (modified) (2 diffs)
-
tests/phpunit/tests/user/multisite.php (modified) (2 diffs)
-
tests/phpunit/tests/user/query.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/class-wp-user.php
r60915 r61037 38 38 * @property string $syntax_highlighting 39 39 * @property string $use_ssl 40 * @property array<string, bool> $caps41 * @property string[] $roles42 * @property array<string, bool> $allcaps43 40 */ 44 41 #[AllowDynamicProperties] … … 64 61 * 65 62 * @since 2.0.0 66 * @var array<string, bool>|nullArray of key/value pairs where keys represent a capability name67 * and boolean values represent whether the user has that capability.68 */ 69 p rotected $caps = null;63 * @var bool[] Array of key/value pairs where keys represent a capability name 64 * and boolean values represent whether the user has that capability. 65 */ 66 public $caps = array(); 70 67 71 68 /** … … 83 80 * @var string[] 84 81 */ 85 p rotected$roles = array();82 public $roles = array(); 86 83 87 84 /** … … 89 86 * 90 87 * @since 2.0.0 91 * @var array<string, bool>Array of key/value pairs where keys represent a capability name92 * and boolean values represent whether the user has that capability.93 */ 94 p rotected$allcaps = array();88 * @var bool[] Array of key/value pairs where keys represent a capability name 89 * and boolean values represent whether the user has that capability. 90 */ 91 public $allcaps = array(); 95 92 96 93 /** … … 292 289 } 293 290 294 if ( in_array( $key, array( 'caps', 'allcaps', 'roles' ), true ) ) {295 return true;296 }297 298 291 if ( isset( $this->data->$key ) ) { 299 292 return true; … … 327 320 ); 328 321 return $this->ID; 329 }330 331 if ( in_array( $key, array( 'caps', 'allcaps', 'roles' ), true ) ) {332 $this->load_capability_data();333 return $this->$key;334 322 } 335 323 … … 376 364 } 377 365 378 // Ensure capability data is loaded before setting related properties.379 if ( in_array( $key, array( 'caps', 'allcaps', 'roles' ), true ) ) {380 $this->load_capability_data();381 $this->$key = $value;382 return;383 }384 385 366 $this->data->$key = $value; 386 367 } … … 406 387 } 407 388 408 if ( in_array( $key, array( 'caps', 'allcaps', 'roles' ), true ) ) {409 $this->$key = null;410 }411 412 389 if ( isset( $this->data->$key ) ) { 413 390 unset( $this->data->$key ); … … 538 515 539 516 $wp_roles = wp_roles(); 540 541 // Edge case: In case someone calls this method before lazy initialization, we need to initialize on demand.542 if ( ! isset( $this->caps ) ) {543 $this->caps = $this->get_caps_data();544 }545 517 546 518 // Filter out caps that are not role names and assign to $this->roles. … … 577 549 return; 578 550 } 579 $this->load_capability_data();580 551 581 552 if ( in_array( $role, $this->roles, true ) ) { … … 607 578 */ 608 579 public function remove_role( $role ) { 609 $this->load_capability_data();610 580 if ( ! in_array( $role, $this->roles, true ) ) { 611 581 return; … … 640 610 */ 641 611 public function set_role( $role ) { 642 $this->load_capability_data();643 612 if ( 1 === count( $this->roles ) && current( $this->roles ) === $role ) { 644 613 return; … … 742 711 */ 743 712 public function add_cap( $cap, $grant = true ) { 744 $this->load_capability_data();745 713 $this->caps[ $cap ] = $grant; 746 714 update_user_meta( $this->ID, $this->cap_key, $this->caps ); … … 757 725 */ 758 726 public function remove_cap( $cap ) { 759 $this->load_capability_data();760 727 if ( ! isset( $this->caps[ $cap ] ) ) { 761 728 return; … … 776 743 public function remove_all_caps() { 777 744 global $wpdb; 778 $this->caps = null;745 $this->caps = array(); 779 746 delete_user_meta( $this->ID, $this->cap_key ); 780 747 delete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' ); 781 $this-> load_capability_data();748 $this->get_role_caps(); 782 749 } 783 750 … … 810 777 */ 811 778 public function has_cap( $cap, ...$args ) { 812 $this->load_capability_data();813 814 779 if ( is_numeric( $cap ) ) { 815 780 _deprecated_argument( __FUNCTION__, '2.0.0', __( 'Usage of user levels is deprecated. Use capabilities instead.' ) ); … … 913 878 914 879 $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities'; 915 $this->caps = null; 880 881 $this->caps = $this->get_caps_data(); 882 883 $this->get_role_caps(); 916 884 } 917 885 … … 944 912 return $caps; 945 913 } 946 947 /**948 * Loads capability data if it has not been loaded yet.949 *950 * @since 6.9.0951 */952 private function load_capability_data() {953 if ( isset( $this->caps ) ) {954 return;955 }956 $this->caps = $this->get_caps_data();957 $this->get_role_caps();958 }959 914 } -
trunk/tests/phpunit/tests/user/capabilities.php
r60915 r61037 994 994 995 995 /** 996 * Test adding capabilities, roles, and allcaps manually to a user.997 *998 * @ticket 58001999 *1000 * @dataProvider data_add_user_properties_manually1001 *1002 * @param string $property_name The property name to set.1003 * @param array $property_value The property value to set.1004 * @param bool $check_null Whether to check that the property is null after unsetting it.1005 */1006 public function test_add_user_properties_manually( $property_name, $property_value, $check_null ) {1007 $id = self::factory()->user->create();1008 $user = new WP_User( $id );1009 $user->{$property_name} = $property_value;1010 1011 $this->assertSameSets( $property_value, $user->{$property_name}, "User property {$property_name} was not set correctly." );1012 unset( $user->{$property_name} );1013 if ( $check_null ) {1014 $this->assertNull( $user->{$property_name}, "User property {$property_name} should be null after unsetting it." );1015 }1016 }1017 1018 /**1019 * Data provider for test_add_user_properties_manually.1020 *1021 * @return array<string, array{0:string,1:array}>1022 */1023 public function data_add_user_properties_manually() {1024 return array(1025 'caps' => array( 'caps', array( 'foo' => true ), false ),1026 'roles' => array( 'roles', array( 'foo' => true ), true ),1027 'allcaps' => array( 'allcaps', array( 'foo' => true ), true ),1028 );1029 }1030 1031 /**1032 996 * Test add_role with implied capabilities grant successfully grants capabilities. 1033 997 * … … 1135 1099 $this->flush_roles(); 1136 1100 $this->assertFalse( $wp_roles->is_role( $role_name ) ); 1137 }1138 1139 /**1140 * @ticket 580011141 */1142 public function test_get_role_caps() {1143 $id_1 = self::$users['contributor']->ID;1144 $user_1 = new WP_User( $id_1 );1145 1146 $role_caps = $user_1->get_role_caps();1147 $this->assertIsArray( $role_caps, 'User role capabilities should be an array' );1148 $this->assertArrayHasKey( 'edit_posts', $role_caps, 'User role capabilities should contain the edit_posts capability' );1149 }1150 1151 /**1152 * @ticket 580011153 */1154 public function test_user_lazy_capabilities() {1155 $id_1 = self::$users['contributor']->ID;1156 $user_1 = new WP_User( $id_1 );1157 1158 $this->assertTrue( isset( $user_1->roles ), 'User roles should be set' );1159 $this->assertTrue( isset( $user_1->allcaps ), 'User all capabilities should be set' );1160 $this->assertTrue( isset( $user_1->caps ), 'User capabilities should be set' );1161 $this->assertIsArray( $user_1->roles, 'User roles should be an array' );1162 $this->assertSame( array( 'contributor' ), $user_1->roles, 'User roles should match' );1163 $this->assertIsArray( $user_1->allcaps, 'User allcaps should be an array' );1164 $this->assertIsArray( $user_1->caps, 'User caps should be an array' );1165 1166 $caps = $this->getAllCapsAndRoles();1167 foreach ( $caps as $cap => $roles ) {1168 if ( in_array( 'contributor', $roles, true ) ) {1169 $this->assertTrue( $user_1->has_cap( $cap ), "User should have the {$cap} capability" );1170 }1171 }1172 1101 } 1173 1102 -
trunk/tests/phpunit/tests/user/multisite.php
r60977 r61037 370 370 switch_to_blog( $site_id ); 371 371 $user = get_user_by( 'id', $user_id ); 372 $this->assertContains( 'subscriber', $user->roles, 'User should have subscriber role' );373 372 restore_current_blog(); 374 373 … … 376 375 wpmu_delete_user( $user_id ); 377 376 378 $this->assertContains( 'subscriber', $user->roles , 'User should still have subscriber role');377 $this->assertContains( 'subscriber', $user->roles ); 379 378 } 380 379 -
trunk/tests/phpunit/tests/user/query.php
r60915 r61037 163 163 add_filter( 'update_user_metadata_cache', array( $filter, 'filter' ), 10, 2 ); 164 164 165 $query =new WP_User_Query(165 new WP_User_Query( 166 166 array( 167 167 'include' => self::$author_ids, … … 169 169 ) 170 170 ); 171 172 $users = $query->get_results();173 foreach ( $users as $user ) {174 $this->assertIsArray( $user->roles );175 foreach ( $user->roles as $role ) {176 $this->assertIsString( $role );177 }178 }179 171 180 172 $args = $filter->get_args();
Note: See TracChangeset
for help on using the changeset viewer.