Make WordPress Core


Ignore:
Timestamp:
10/21/2025 03:23:43 PM (3 months ago)
Author:
jorbin
Message:

Users: Revert Lazy load user capabilities in WP_User object.

The change from public to protected broke tests for extenders and this also broke WP_User::to_array().

Reverts [60915].

Props davidbaumwald, ellatrix, timothyblynjacobs, welcher, spacedmonkey, bradshawtm, peterwilsoncc, jorbin.
See #58001.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-user.php

    r60915 r61037  
    3838 * @property string $syntax_highlighting
    3939 * @property string $use_ssl
    40  * @property array<string, bool> $caps
    41  * @property string[] $roles
    42  * @property array<string, bool> $allcaps
    4340 */
    4441#[AllowDynamicProperties]
     
    6461     *
    6562     * @since 2.0.0
    66      * @var array<string, bool>|null Array of key/value pairs where keys represent a capability name
    67      *                               and boolean values represent whether the user has that capability.
    68      */
    69     protected $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();
    7067
    7168    /**
     
    8380     * @var string[]
    8481     */
    85     protected $roles = array();
     82    public $roles = array();
    8683
    8784    /**
     
    8986     *
    9087     * @since 2.0.0
    91      * @var array<string, bool> Array of key/value pairs where keys represent a capability name
    92      *                          and boolean values represent whether the user has that capability.
    93      */
    94     protected $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();
    9592
    9693    /**
     
    292289        }
    293290
    294         if ( in_array( $key, array( 'caps', 'allcaps', 'roles' ), true ) ) {
    295             return true;
    296         }
    297 
    298291        if ( isset( $this->data->$key ) ) {
    299292            return true;
     
    327320            );
    328321            return $this->ID;
    329         }
    330 
    331         if ( in_array( $key, array( 'caps', 'allcaps', 'roles' ), true ) ) {
    332             $this->load_capability_data();
    333             return $this->$key;
    334322        }
    335323
     
    376364        }
    377365
    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 
    385366        $this->data->$key = $value;
    386367    }
     
    406387        }
    407388
    408         if ( in_array( $key, array( 'caps', 'allcaps', 'roles' ), true ) ) {
    409             $this->$key = null;
    410         }
    411 
    412389        if ( isset( $this->data->$key ) ) {
    413390            unset( $this->data->$key );
     
    538515
    539516        $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         }
    545517
    546518        // Filter out caps that are not role names and assign to $this->roles.
     
    577549            return;
    578550        }
    579         $this->load_capability_data();
    580551
    581552        if ( in_array( $role, $this->roles, true ) ) {
     
    607578     */
    608579    public function remove_role( $role ) {
    609         $this->load_capability_data();
    610580        if ( ! in_array( $role, $this->roles, true ) ) {
    611581            return;
     
    640610     */
    641611    public function set_role( $role ) {
    642         $this->load_capability_data();
    643612        if ( 1 === count( $this->roles ) && current( $this->roles ) === $role ) {
    644613            return;
     
    742711     */
    743712    public function add_cap( $cap, $grant = true ) {
    744         $this->load_capability_data();
    745713        $this->caps[ $cap ] = $grant;
    746714        update_user_meta( $this->ID, $this->cap_key, $this->caps );
     
    757725     */
    758726    public function remove_cap( $cap ) {
    759         $this->load_capability_data();
    760727        if ( ! isset( $this->caps[ $cap ] ) ) {
    761728            return;
     
    776743    public function remove_all_caps() {
    777744        global $wpdb;
    778         $this->caps = null;
     745        $this->caps = array();
    779746        delete_user_meta( $this->ID, $this->cap_key );
    780747        delete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' );
    781         $this->load_capability_data();
     748        $this->get_role_caps();
    782749    }
    783750
     
    810777     */
    811778    public function has_cap( $cap, ...$args ) {
    812         $this->load_capability_data();
    813 
    814779        if ( is_numeric( $cap ) ) {
    815780            _deprecated_argument( __FUNCTION__, '2.0.0', __( 'Usage of user levels is deprecated. Use capabilities instead.' ) );
     
    913878
    914879        $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();
    916884    }
    917885
     
    944912        return $caps;
    945913    }
    946 
    947     /**
    948      * Loads capability data if it has not been loaded yet.
    949      *
    950      * @since 6.9.0
    951      */
    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     }
    959914}
Note: See TracChangeset for help on using the changeset viewer.