WordPress.org

Make WordPress Core

Ticket #38645: 38645.4.diff

File 38645.4.diff, 8.5 KB (added by flixos90, 2 years ago)
  • src/wp-includes/class-wp-roles.php

     
    6565        public $use_db = true;
    6666
    6767        /**
    68          * Constructor
     68         * The site ID the roles are initialized for.
    6969         *
    70          * @since 2.0.0
     70         * @since 4.9.0
     71         * @var int
    7172         */
    72         public function __construct() {
    73                 $this->_init();
    74         }
     73        protected $blog_id = 0;
    7574
    7675        /**
    77          * Make private/protected methods readable for backward compatibility.
     76         * Constructor
    7877         *
    79          * @since 4.0.0
     78         * @since 2.0.0
     79         * @since 4.9.0 The $blog_id argument was added.
    8080         *
    81          * @param callable $name      Method to call.
    82          * @param array    $arguments Arguments to pass when calling.
    83          * @return mixed|false Return value of the callback, false otherwise.
     81         * @global array $wp_user_roles Used to set the 'roles' property value.
     82         *
     83         * @param int $blog_id Site ID to initialize roles for. Default is the current site.
    8484         */
    85         public function __call( $name, $arguments ) {
    86                 if ( '_init' === $name ) {
    87                         return call_user_func_array( array( $this, $name ), $arguments );
    88                 }
    89                 return false;
     85        public function __construct( $blog_id = null ) {
     86                global $wp_user_roles;
     87
     88                $this->use_db = empty( $wp_user_roles );
     89
     90                $this->for_blog( $blog_id );
    9091        }
    9192
    9293        /**
     
    9798         * be used and the role option will not be updated or used.
    9899         *
    99100         * @since 2.1.0
    100          *
    101          * @global array $wp_user_roles Used to set the 'roles' property value.
     101         * @deprecated 4.9.0 Use WP_Roles::for_blog()
    102102         */
    103103        protected function _init() {
    104                 global $wp_user_roles, $wpdb;
    105 
    106                 $this->role_key = $wpdb->get_blog_prefix() . 'user_roles';
    107                 if ( ! empty( $wp_user_roles ) ) {
    108                         $this->roles = $wp_user_roles;
    109                         $this->use_db = false;
    110                 } else {
    111                         $this->roles = get_option( $this->role_key );
    112                 }
     104                _deprecated_function( __METHOD__, '4.9.0', 'WP_Roles::for_blog()' );
    113105
    114                 if ( empty( $this->roles ) )
    115                         return;
    116 
    117                 $this->role_objects = array();
    118                 $this->role_names =  array();
    119                 foreach ( array_keys( $this->roles ) as $role ) {
    120                         $this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] );
    121                         $this->role_names[$role] = $this->roles[$role]['name'];
    122                 }
    123 
    124                 /**
    125                  * After the roles have been initialized, allow plugins to add their own roles.
    126                  *
    127                  * @since 4.7.0
    128                  *
    129                  * @param WP_Roles $this A reference to the WP_Roles object.
    130                  */
    131                 do_action( 'wp_roles_init', $this );
     106                $this->for_blog();
    132107        }
    133108
    134109        /**
     
    138113         * after switching wpdb to a new site ID.
    139114         *
    140115         * @since 3.5.0
    141          * @deprecated 4.7.0 Use new WP_Roles()
     116         * @deprecated 4.7.0 Use WP_Roles::for_blog()
    142117         */
    143118        public function reinit() {
    144                 _deprecated_function( __METHOD__, '4.7.0', 'new WP_Roles()' );
    145                 $this->_init();
     119                _deprecated_function( __METHOD__, '4.7.0', 'WP_Roles::for_blog()' );
     120
     121                $this->for_blog();
    146122        }
    147123
    148124        /**
     
    270246        public function is_role( $role ) {
    271247                return isset( $this->role_names[$role] );
    272248        }
     249
     250        /**
     251         * Initializes all of the available roles.
     252         *
     253         * @since 4.9.0
     254         */
     255        public function init_roles() {
     256                if ( empty( $this->roles ) ) {
     257                        return;
     258                }
     259
     260                $this->role_objects = array();
     261                $this->role_names =  array();
     262                foreach ( array_keys( $this->roles ) as $role ) {
     263                        $this->role_objects[ $role ] = new WP_Role( $role, $this->roles[ $role ]['capabilities'] );
     264                        $this->role_names[ $role ] = $this->roles[ $role ]['name'];
     265                }
     266
     267                /**
     268                 * After the roles have been initialized, allow plugins to add their own roles.
     269                 *
     270                 * @since 4.7.0
     271                 *
     272                 * @param WP_Roles $this A reference to the WP_Roles object.
     273                 */
     274                do_action( 'wp_roles_init', $this );
     275        }
     276
     277        /**
     278         * Sets the site to operate on. Defaults to the current site.
     279         *
     280         * @since 4.9.0
     281         *
     282         * @global wpdb $wpdb WordPress database abstraction object.
     283         *
     284         * @param int $blog_id Site ID to initialize roles for. Default is the current site.
     285         */
     286        public function for_blog( $blog_id = null ) {
     287                global $wpdb;
     288
     289                if ( ! empty( $blog_id ) ) {
     290                        $this->blog_id = absint( $blog_id );
     291                } else {
     292                        $this->blog_id = get_current_blog_id();
     293                }
     294
     295                $this->role_key = $wpdb->get_blog_prefix( $this->blog_id ) . 'user_roles';
     296
     297                if ( ! empty( $this->roles ) && ! $this->use_db ) {
     298                        return;
     299                }
     300
     301                $this->roles = $this->get_roles_data();
     302
     303                $this->init_roles();
     304        }
     305
     306        /**
     307         * Gets the available roles data.
     308         *
     309         * @since 4.9.0
     310         *
     311         * @global array $wp_user_roles Used to set the 'roles' property value.
     312         *
     313         * @return array Roles array.
     314         */
     315        protected function get_roles_data() {
     316                global $wp_user_roles;
     317
     318                if ( ! empty( $wp_user_roles ) ) {
     319                        return $wp_user_roles;
     320                }
     321
     322                if ( $this->blog_id != get_current_blog_id() ) {
     323                        remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );
     324
     325                        $roles = get_blog_option( $this->blog_id, $this->role_key, array() );
     326
     327                        add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );
     328
     329                        return $roles;
     330                }
     331
     332                return get_option( $this->role_key, array() );
     333        }
    273334}
  • src/wp-includes/ms-blogs.php

     
    793793 * @return true Always returns True.
    794794 */
    795795function switch_to_blog( $new_blog, $deprecated = null ) {
    796         global $wpdb, $wp_roles;
     796        global $wpdb;
    797797
    798798        $blog_id = get_current_blog_id();
    799799        if ( empty( $new_blog ) ) {
     
    848848                }
    849849        }
    850850
    851         if ( did_action( 'init' ) ) {
    852                 $wp_roles = new WP_Roles();
    853                 $current_user = wp_get_current_user();
    854                 $current_user->for_blog( $new_blog );
    855         }
    856 
    857851        /** This filter is documented in wp-includes/ms-blogs.php */
    858852        do_action( 'switch_blog', $new_blog, $prev_blog_id );
    859853        $GLOBALS['switched'] = true;
     
    877871 * @return bool True on success, false if we're already on the current blog
    878872 */
    879873function restore_current_blog() {
    880         global $wpdb, $wp_roles;
     874        global $wpdb;
    881875
    882876        if ( empty( $GLOBALS['_wp_switched_stack'] ) ) {
    883877                return false;
     
    922916                }
    923917        }
    924918
    925         if ( did_action( 'init' ) ) {
    926                 $wp_roles = new WP_Roles();
    927                 $current_user = wp_get_current_user();
    928                 $current_user->for_blog( $blog );
    929         }
    930 
    931919        /** This filter is documented in wp-includes/ms-blogs.php */
    932920        do_action( 'switch_blog', $blog, $prev_blog_id );
    933921
     
    938926}
    939927
    940928/**
     929 * Switches the initialized roles and current user capabilities to another site.
     930 *
     931 * @since 4.9.0
     932 *
     933 * @param int $new_site_id New site ID.
     934 * @param int $old_site_id Old site ID.
     935 */
     936function wp_switch_roles_and_user( $new_site_id, $old_site_id ) {
     937        if ( $new_site_id == $old_site_id ) {
     938                return;
     939        }
     940
     941        if ( ! did_action( 'init' ) ) {
     942                return;
     943        }
     944
     945        wp_roles()->for_blog( $new_site_id );
     946        wp_get_current_user()->for_blog( $new_site_id );
     947}
     948
     949/**
    941950 * Determines if switch_to_blog() is in effect
    942951 *
    943952 * @since 3.5.0
  • src/wp-includes/ms-default-filters.php

     
    3232add_action( 'network_user_new_created_user',   'wp_send_new_user_notifications' );
    3333add_filter( 'sanitize_user', 'strtolower' );
    3434
     35// Roles
     36add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );
     37
    3538// Blogs
    3639add_filter( 'wpmu_validate_blog_signup', 'signup_nonce_check' );
    3740add_action( 'wpmu_new_blog', 'wpmu_log_new_registrations', 10, 2 );
  • tests/phpunit/tests/user/capabilities.php

     
    18401840                $this->assertFalse( user_can( self::$users['contributor']->ID,   'remove_user', self::$users['contributor']->ID ) );
    18411841                $this->assertFalse( user_can( self::$users['subscriber']->ID,    'remove_user', self::$users['subscriber']->ID ) );
    18421842        }
     1843
     1844        /**
     1845         * @ticket 38645
     1846         * @group ms-required
     1847         */
     1848        function test_init_roles_for_different_site() {
     1849                global $wpdb;
     1850
     1851                $site_id = self::factory()->blog->create();
     1852
     1853                switch_to_blog( $site_id );
     1854
     1855                $role_name = 'uploader';
     1856                add_role( $role_name, 'Uploader', array(
     1857                        'read'         => true,
     1858                        'upload_files' => true,
     1859                ) );
     1860
     1861                restore_current_blog();
     1862
     1863                $wp_roles = wp_roles();
     1864                $wp_roles->for_blog( $site_id );
     1865
     1866                $this->assertTrue( isset( $wp_roles->role_objects[ $role_name ] ) );
     1867        }
    18431868}