WordPress.org

Make WordPress Core

Ticket #36961: 36961.8.diff

File 36961.8.diff, 9.1 KB (added by flixos90, 2 years ago)
  • src/wp-includes/class-wp-user.php

     
    9191        public $filter = null;
    9292
    9393        /**
     94         * The site ID the capabilities of this user are initialized for.
     95         *
     96         * @since 4.9.0
     97         * @var int
     98         */
     99        private $site_id = 0;
     100
     101        /**
    94102         * @static
    95103         * @since 3.3.0
    96104         * @var array
     
    108116         *
    109117         * @param int|string|stdClass|WP_User $id User's ID, a WP_User object, or a user object from the DB.
    110118         * @param string $name Optional. User's username
    111          * @param int $blog_id Optional Site ID, defaults to current site.
     119         * @param int $site_id Optional Site ID, defaults to current site.
    112120         */
    113         public function __construct( $id = 0, $name = '', $blog_id = '' ) {
     121        public function __construct( $id = 0, $name = '', $site_id = '' ) {
    114122                if ( ! isset( self::$back_compat_keys ) ) {
    115123                        $prefix = $GLOBALS['wpdb']->prefix;
    116124                        self::$back_compat_keys = array(
     
    124132                }
    125133
    126134                if ( $id instanceof WP_User ) {
    127                         $this->init( $id->data, $blog_id );
     135                        $this->init( $id->data, $site_id );
    128136                        return;
    129137                } elseif ( is_object( $id ) ) {
    130                         $this->init( $id, $blog_id );
     138                        $this->init( $id, $site_id );
    131139                        return;
    132140                }
    133141
     
    143151                }
    144152
    145153                if ( $data ) {
    146                         $this->init( $data, $blog_id );
     154                        $this->init( $data, $site_id );
    147155                } else {
    148156                        $this->data = new stdClass;
    149157                }
     
    155163         * @since  3.3.0
    156164         *
    157165         * @param object $data    User DB row object.
    158          * @param int    $blog_id Optional. The site ID to initialize for.
     166         * @param int    $site_id Optional. The site ID to initialize for.
    159167         */
    160         public function init( $data, $blog_id = '' ) {
     168        public function init( $data, $site_id = '' ) {
    161169                $this->data = $data;
    162170                $this->ID = (int) $data->ID;
    163171
    164                 $this->for_blog( $blog_id );
     172                $this->for_site( $site_id );
    165173        }
    166174
    167175        /**
     
    239247        }
    240248
    241249        /**
    242          * Makes private/protected methods readable for backward compatibility.
    243          *
    244          * @since 4.3.0
    245          *
    246          * @param callable $name      Method to call.
    247          * @param array    $arguments Arguments to pass when calling.
    248          * @return mixed|false Return value of the callback, false otherwise.
    249          */
    250         public function __call( $name, $arguments ) {
    251                 if ( '_init_caps' === $name ) {
    252                         return call_user_func_array( array( $this, $name ), $arguments );
    253                 }
    254                 return false;
    255         }
    256 
    257         /**
    258250         * Magic method for checking the existence of a certain custom field.
    259251         *
    260252         * @since 3.3.0
     
    423415        }
    424416
    425417        /**
     418         * Makes private/protected methods readable for backward compatibility.
     419         *
     420         * @since 4.3.0
     421         *
     422         * @param callable $name      Method to call.
     423         * @param array    $arguments Arguments to pass when calling.
     424         * @return mixed|false Return value of the callback, false otherwise.
     425         */
     426        public function __call( $name, $arguments ) {
     427                if ( '_init_caps' === $name ) {
     428                        return call_user_func_array( array( $this, $name ), $arguments );
     429                }
     430                return false;
     431        }
     432
     433        /**
    426434         * Set up capability object properties.
    427435         *
    428436         * Will set the value for the 'cap_key' property to current database table
     
    431439         * used.
    432440         *
    433441         * @since 2.1.0
     442         * @deprecated 4.9.0 Use WP_User::for_site()
    434443         *
    435444         * @global wpdb $wpdb WordPress database abstraction object.
    436445         *
     
    439448        protected function _init_caps( $cap_key = '' ) {
    440449                global $wpdb;
    441450
    442                 if ( empty($cap_key) )
    443                         $this->cap_key = $wpdb->get_blog_prefix() . 'capabilities';
    444                 else
    445                         $this->cap_key = $cap_key;
     451                _deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' );
    446452
    447                 $this->caps = get_user_meta( $this->ID, $this->cap_key, true );
     453                if ( empty( $cap_key ) ) {
     454                        $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities';
     455                } else {
     456                        $this->cap_key = $cap_key;
     457                }
    448458
    449                 if ( ! is_array( $this->caps ) )
    450                         $this->caps = array();
     459                $this->caps = $this->get_caps_data();
    451460
    452461                $this->get_role_caps();
    453462        }
     
    465474         * @return array List of all capabilities for the user.
    466475         */
    467476        public function get_role_caps() {
     477                $switch_site = false;
     478                if ( is_multisite() && $this->site_id != get_current_blog_id() ) {
     479                        $switch_site = true;
     480
     481                        switch_to_blog( $this->site_id );
     482                }
     483
    468484                $wp_roles = wp_roles();
    469485
    470486                //Filter out caps that are not role names and assign to $this->roles
     
    479495                }
    480496                $this->allcaps = array_merge( (array) $this->allcaps, (array) $this->caps );
    481497
     498                if ( $switch_site ) {
     499                        restore_current_blog();
     500                }
     501
    482502                return $this->allcaps;
    483503        }
    484504
     
    753773         * Set the site to operate on. Defaults to the current site.
    754774         *
    755775         * @since 3.0.0
     776         * @deprecated 4.9.0 Use WP_User::for_site()
    756777         *
    757778         * @global wpdb $wpdb WordPress database abstraction object.
    758779         *
    759780         * @param int $blog_id Optional. Site ID, defaults to current site.
    760781         */
    761782        public function for_blog( $blog_id = '' ) {
     783                _deprecated_function( __METHOD__, '4.9.0', 'WP_User::for_site()' );
     784
     785                $this->for_site( $blog_id );
     786        }
     787
     788        /**
     789         * Sets the site to operate on. Defaults to the current site.
     790         *
     791         * @since 4.9.0
     792         *
     793         * @global wpdb $wpdb WordPress database abstraction object.
     794         *
     795         * @param int $site_id Site ID to initialize user capabilities for. Default is the current site.
     796         */
     797        public function for_site( $site_id = '' ) {
    762798                global $wpdb;
    763                 if ( ! empty( $blog_id ) )
    764                         $cap_key = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities';
    765                 else
    766                         $cap_key = '';
    767                 $this->_init_caps( $cap_key );
     799
     800                if ( ! empty( $site_id ) ) {
     801                        $this->site_id = absint( $site_id );
     802                } else {
     803                        $this->site_id = get_current_blog_id();
     804                }
     805
     806                $this->cap_key = $wpdb->get_blog_prefix( $this->site_id ) . 'capabilities';
     807
     808                $this->caps = $this->get_caps_data();
     809
     810                $this->get_role_caps();
     811        }
     812
     813        /**
     814         * Gets the available user capabilities data.
     815         *
     816         * @since 4.9.0
     817         *
     818         * @return array User capabilities array.
     819         */
     820        private function get_caps_data() {
     821                $caps = get_user_meta( $this->ID, $this->cap_key, true );
     822
     823                if ( ! is_array( $caps ) ) {
     824                        return array();
     825                }
     826
     827                return $caps;
    768828        }
    769829}
  • src/wp-includes/ms-blogs.php

     
    851851        if ( did_action( 'init' ) ) {
    852852                $wp_roles = new WP_Roles();
    853853                $current_user = wp_get_current_user();
    854                 $current_user->for_blog( $new_blog );
     854                $current_user->for_site( $new_blog );
    855855        }
    856856
    857857        /** This filter is documented in wp-includes/ms-blogs.php */
     
    925925        if ( did_action( 'init' ) ) {
    926926                $wp_roles = new WP_Roles();
    927927                $current_user = wp_get_current_user();
    928                 $current_user->for_blog( $blog );
     928                $current_user->for_site( $blog );
    929929        }
    930930
    931931        /** This filter is documented in wp-includes/ms-blogs.php */
  • tests/phpunit/tests/user/capabilities.php

     
    18481848                $this->assertFalse( user_can( self::$users['contributor']->ID,   'remove_user', self::$users['contributor']->ID ) );
    18491849                $this->assertFalse( user_can( self::$users['subscriber']->ID,    'remove_user', self::$users['subscriber']->ID ) );
    18501850        }
     1851
     1852        /**
     1853         * @ticket 36961
     1854         * @group ms-required
     1855         */
     1856        function test_init_user_caps_for_different_site() {
     1857                global $wpdb;
     1858
     1859                $site_id = self::factory()->blog->create( array( 'user_id' => self::$users['administrator']->ID ) );
     1860
     1861                switch_to_blog( $site_id );
     1862
     1863                $role_name = 'uploader';
     1864                add_role( $role_name, 'Uploader', array(
     1865                        'read'         => true,
     1866                        'upload_files' => true,
     1867                ) );
     1868                add_user_to_blog( $site_id, self::$users['subscriber']->ID, $role_name );
     1869
     1870                restore_current_blog();
     1871
     1872                $user = new WP_User( self::$users['subscriber']->ID, '', $site_id );
     1873                $this->assertTrue( $user->has_cap( 'upload_files' ) );
     1874        }
     1875
     1876        /**
     1877         * @ticket 36961
     1878         * @group ms-required
     1879         */
     1880        function test_init_user_caps_for_different_site_by_user_switch() {
     1881                global $wpdb;
     1882
     1883                $user = new WP_User( self::$users['subscriber']->ID );
     1884
     1885                $site_id = self::factory()->blog->create( array( 'user_id' => self::$users['administrator']->ID ) );
     1886
     1887                switch_to_blog( $site_id );
     1888
     1889                $role_name = 'uploader';
     1890                add_role( $role_name, 'Uploader', array(
     1891                        'read'         => true,
     1892                        'upload_files' => true,
     1893                ) );
     1894                add_user_to_blog( $site_id, self::$users['subscriber']->ID, $role_name );
     1895
     1896                restore_current_blog();
     1897
     1898                $user->for_site( $site_id );
     1899                $this->assertTrue( $user->has_cap( 'upload_files' ) );
     1900        }
    18511901}
  • tests/phpunit/tests/user.php

     
    180180                $this->assertEquals( 'foo', $user->$key );
    181181                $this->assertEquals( 'foo', $user->data->$key );  // This will fail with WP < 3.3
    182182
    183                 foreach ( (array) $user as $key => $value ) {
     183                foreach ( get_object_vars( $user ) as $key => $value ) {
    184184                        $this->assertEquals( $value, $user->$key );
    185185                }
    186186        }