diff --git a/wp-includes/admin-bar.php b/wp-includes/admin-bar.php index 4bc0302623..31122fe8cf 100644 --- a/wp-includes/admin-bar.php +++ b/wp-includes/admin-bar.php @@ -344,8 +344,8 @@ function wp_admin_bar_my_sites_menu( $wp_admin_bar ) { $blue_wp_logo_url = includes_url('images/wpmini-blue.png'); foreach ( (array) $wp_admin_bar->user->blogs as $blog ) { - // @todo Replace with some favicon lookup. - //$blavatar = 'Blavatar'; + switch_to_blog( $blog->userblog_id ); + $blavatar = '' . esc_attr__( 'Blavatar' ) . ''; $blogname = empty( $blog->blogname ) ? $blog->domain : $blog->blogname; @@ -355,28 +355,28 @@ function wp_admin_bar_my_sites_menu( $wp_admin_bar ) { 'parent' => 'my-sites-list', 'id' => $menu_id, 'title' => $blavatar . $blogname, - 'href' => get_admin_url( $blog->userblog_id ), + 'href' => admin_url(), ) ); $wp_admin_bar->add_menu( array( 'parent' => $menu_id, 'id' => $menu_id . '-d', 'title' => __( 'Dashboard' ), - 'href' => get_admin_url( $blog->userblog_id ), + 'href' => admin_url(), ) ); - if ( current_user_can_for_blog( $blog->userblog_id, 'edit_posts' ) ) { + if ( current_user_can( 'edit_posts' ) ) { $wp_admin_bar->add_menu( array( 'parent' => $menu_id, 'id' => $menu_id . '-n', 'title' => __( 'New Post' ), - 'href' => get_admin_url( $blog->userblog_id, 'post-new.php' ), + 'href' => admin_url( 'post-new.php' ), ) ); $wp_admin_bar->add_menu( array( 'parent' => $menu_id, 'id' => $menu_id . '-c', 'title' => __( 'Manage Comments' ), - 'href' => get_admin_url( $blog->userblog_id, 'edit-comments.php' ), + 'href' => admin_url( 'edit-comments.php' ), ) ); } @@ -384,8 +384,10 @@ function wp_admin_bar_my_sites_menu( $wp_admin_bar ) { 'parent' => $menu_id, 'id' => $menu_id . '-v', 'title' => __( 'Visit Site' ), - 'href' => get_home_url( $blog->userblog_id, '/' ), + 'href' => home_url( '/' ), ) ); + + restore_current_blog(); } } diff --git a/wp-includes/capabilities.php b/wp-includes/capabilities.php index 4687d4f18b..585ab28312 100644 --- a/wp-includes/capabilities.php +++ b/wp-includes/capabilities.php @@ -108,7 +108,37 @@ class WP_Roles { $this->role_objects = array(); $this->role_names = array(); - foreach ( (array) $this->roles as $role => $data ) { + foreach ( array_keys( $this->roles ) as $role ) { + $this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] ); + $this->role_names[$role] = $this->roles[$role]['name']; + } + } + + /** + * Reinitialize the object + * + * Recreates the role objects. This is typically called only by switch_to_blog() + * after switching wpdb to a new blog ID. + * + * @since 3.5.0 + * @access public + */ + function reinit() { + // There is no need to reinit if using the wp_user_roles global. + if ( ! $this->use_db ) + return; + + global $wpdb, $wp_user_roles; + + // Duplicated from _init() to avoid an extra function call. + $this->role_key = $wpdb->prefix . 'user_roles'; + $this->roles = get_option( $this->role_key ); + if ( empty( $this->roles ) ) + return; + + $this->role_objects = array(); + $this->role_names = array(); + foreach ( array_keys( $this->roles ) as $role ) { $this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] ); $this->role_names[$role] = $this->roles[$role]['name']; } @@ -233,8 +263,7 @@ class WP_Roles { * @param string $role Role name to look up. * @return bool */ - function is_role( $role ) - { + function is_role( $role ) { return isset( $this->role_names[$role] ); } } @@ -1231,21 +1260,21 @@ function current_user_can( $capability ) { * @return bool */ function current_user_can_for_blog( $blog_id, $capability ) { + switch_to_blog( $blog_id ); + $current_user = wp_get_current_user(); if ( empty( $current_user ) ) return false; - // Create new object to avoid stomping the global current_user. - $user = new WP_User( $current_user->ID ); - - // Set the blog id. @todo add blog id arg to WP_User constructor? - $user->for_blog( $blog_id ); - $args = array_slice( func_get_args(), 2 ); $args = array_merge( array( $capability ), $args ); - return call_user_func_array( array( &$user, 'has_cap' ), $args ); + $can = call_user_func_array( array( $current_user, 'has_cap' ), $args ); + + restore_current_blog(); + + return $can; } /** diff --git a/wp-includes/class-wp-xmlrpc-server.php b/wp-includes/class-wp-xmlrpc-server.php index 8965572029..e1b71483b8 100644 --- a/wp-includes/class-wp-xmlrpc-server.php +++ b/wp-includes/class-wp-xmlrpc-server.php @@ -473,9 +473,11 @@ class wp_xmlrpc_server extends IXR_Server { continue; $blog_id = $blog->userblog_id; - $is_admin = current_user_can_for_blog( $blog_id, 'manage_options' ); switch_to_blog( $blog_id ); + + $is_admin = current_user_can( 'manage_options' ); + $struct[] = array( 'isAdmin' => $is_admin, 'url' => home_url( '/' ), @@ -483,6 +485,7 @@ class wp_xmlrpc_server extends IXR_Server { 'blogName' => get_option( 'blogname' ), 'xmlrpc' => site_url( 'xmlrpc.php' ) ); + restore_current_blog(); } diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 4ee94f9ca0..222e23b219 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -1432,7 +1432,7 @@ function get_temp_dir() { * @return array See above for description. */ function wp_upload_dir( $time = null ) { - global $switched; + global $_wp_switched; $siteurl = get_option( 'siteurl' ); $upload_path = get_option( 'upload_path' ); $upload_path = trim($upload_path); @@ -1456,12 +1456,12 @@ function wp_upload_dir( $time = null ) { $url = trailingslashit( $siteurl ) . $upload_path; } - if ( defined('UPLOADS') && !$main_override && ( !isset( $switched ) || $switched === false ) ) { + if ( defined('UPLOADS') && ! $main_override && ! $_wp_switched ) { $dir = ABSPATH . UPLOADS; $url = trailingslashit( $siteurl ) . UPLOADS; } - if ( is_multisite() && !$main_override && ( !isset( $switched ) || $switched === false ) ) { + if ( is_multisite() && ! $main_override && ! $_wp_switched ) { if ( defined( 'BLOGUPLOADDIR' ) ) $dir = untrailingslashit(BLOGUPLOADDIR); $url = str_replace( UPLOADS, 'files', $url ); diff --git a/wp-includes/ms-blogs.php b/wp-includes/ms-blogs.php index 7f4ff6d8ba..79f5c30d84 100644 --- a/wp-includes/ms-blogs.php +++ b/wp-includes/ms-blogs.php @@ -446,72 +446,61 @@ function update_blog_option( $id, $option, $value, $deprecated = null ) { * @since MU * * @param int $new_blog The id of the blog you want to switch to. Default: current blog - * @param bool $validate Whether to check if $new_blog exists before proceeding + * @param bool $deprecated Depecreated argument * @return bool True on success, False if the validation failed */ -function switch_to_blog( $new_blog, $validate = false ) { - global $wpdb, $table_prefix, $blog_id, $switched, $switched_stack, $wp_roles, $wp_object_cache; +function switch_to_blog( $new_blog, $deprecated = null ) { + global $wpdb, $wp_roles; - if ( empty($new_blog) ) - $new_blog = $blog_id; + if ( empty( $new_blog ) ) + $new_blog = $GLOBALS['blog_id']; - if ( $validate && ! get_blog_details( $new_blog ) ) - return false; - - if ( empty($switched_stack) ) - $switched_stack = array(); - - $switched_stack[] = $blog_id; + $GLOBALS['_wp_switched_stack'][] = $GLOBALS['blog_id']; /* If we're switching to the same blog id that we're on, * set the right vars, do the associated actions, but skip * the extra unnecessary work */ - if ( $blog_id == $new_blog ) { - do_action( 'switch_blog', $blog_id, $blog_id ); - $switched = true; + if ( $new_blog == $GLOBALS['blog_id'] ) { + do_action( 'switch_blog', $new_blog, $new_blog ); + $GLOBALS['_wp_switched'] = true; return true; } - $wpdb->set_blog_id($new_blog); - $table_prefix = $wpdb->prefix; - $prev_blog_id = $blog_id; - $blog_id = $new_blog; + $wpdb->set_blog_id( $new_blog ); + $GLOBALS['table_prefix'] = $wpdb->prefix; + $prev_blog_id = $GLOBALS['blog_id']; + $GLOBALS['blog_id'] = $new_blog; - if ( is_object( $wp_roles ) ) { - $wpdb->suppress_errors(); - if ( method_exists( $wp_roles ,'_init' ) ) - $wp_roles->_init(); - elseif ( method_exists( $wp_roles, '__construct' ) ) - $wp_roles->__construct(); - $wpdb->suppress_errors( false ); - } - - if ( did_action('init') ) { + if ( did_action( 'init' ) ) { + $wp_roles->reinit(); $current_user = wp_get_current_user(); - if ( is_object( $current_user ) ) - $current_user->for_blog( $blog_id ); + $current_user->for_blog( $new_blog ); } if ( function_exists( 'wp_cache_switch_to_blog' ) ) { - wp_cache_switch_to_blog( $blog_id ); + wp_cache_switch_to_blog( $new_blog ); } else { + global $wp_object_cache; + if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) $global_groups = $wp_object_cache->global_groups; else $global_groups = false; wp_cache_init(); - if ( function_exists('wp_cache_add_global_groups') ) { + + if ( function_exists( 'wp_cache_add_global_groups' ) ) { if ( is_array( $global_groups ) ) wp_cache_add_global_groups( $global_groups ); else wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); - wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); + wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) ); } } - do_action('switch_blog', $blog_id, $prev_blog_id); - $switched = true; + do_action( 'switch_blog', $new_blog, $prev_blog_id ); + $GLOBALS['_wp_switched'] = true; + return true; } @@ -524,64 +513,57 @@ function switch_to_blog( $new_blog, $validate = false ) { * @return bool True on success, False if we're already on the current blog */ function restore_current_blog() { - global $table_prefix, $wpdb, $blog_id, $switched, $switched_stack, $wp_roles, $wp_object_cache; + global $wpdb, $wp_roles; - if ( !$switched ) + if ( ! $GLOBALS['_wp_switched'] ) return false; - if ( !is_array( $switched_stack ) ) - return false; + $blog = array_pop( $GLOBALS['_wp_switched_stack'] ); - $blog = array_pop( $switched_stack ); - if ( $blog_id == $blog ) { + if ( $GLOBALS['blog_id'] == $blog ) { do_action( 'switch_blog', $blog, $blog ); - /* If we still have items in the switched stack, consider ourselves still 'switched' */ - $switched = ( is_array( $switched_stack ) && count( $switched_stack ) > 0 ); + // If we still have items in the switched stack, consider ourselves still 'switched' + $GLOBALS['_wp_switched'] = ! empty( $GLOBALS['_wp_switched_stack'] ); return true; } - $wpdb->set_blog_id($blog); - $prev_blog_id = $blog_id; - $blog_id = $blog; - $table_prefix = $wpdb->prefix; + $wpdb->set_blog_id( $blog ); + $prev_blog_id = $GLOBALS['blog_id']; + $GLOBALS['blog_id'] = $blog; + $GLOBALS['table_prefix'] = $wpdb->prefix; - if ( is_object( $wp_roles ) ) { - $wpdb->suppress_errors(); - if ( method_exists( $wp_roles ,'_init' ) ) - $wp_roles->_init(); - elseif ( method_exists( $wp_roles, '__construct' ) ) - $wp_roles->__construct(); - $wpdb->suppress_errors( false ); - } - - if ( did_action('init') ) { + if ( did_action( 'init' ) ) { + $wp_roles->reinit(); $current_user = wp_get_current_user(); - if ( is_object( $current_user ) ) - $current_user->for_blog( $blog_id ); + $current_user->for_blog( $blog ); } if ( function_exists( 'wp_cache_switch_to_blog' ) ) { - wp_cache_switch_to_blog( $blog_id ); + wp_cache_switch_to_blog( $blog ); } else { + global $wp_object_cache; + if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) $global_groups = $wp_object_cache->global_groups; else $global_groups = false; wp_cache_init(); - if ( function_exists('wp_cache_add_global_groups') ) { + + if ( function_exists( 'wp_cache_add_global_groups' ) ) { if ( is_array( $global_groups ) ) wp_cache_add_global_groups( $global_groups ); else wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); - wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); + wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) ); } } - do_action('switch_blog', $blog_id, $prev_blog_id); + do_action( 'switch_blog', $blog, $prev_blog_id ); + + // If we still have items in the switched stack, consider ourselves still 'switched' + $GLOBALS['_wp_switched'] = ! empty( $GLOBALS['_wp_switched_stack'] ); - /* If we still have items in the switched stack, consider ourselves still 'switched' */ - $switched = ( is_array( $switched_stack ) && count( $switched_stack ) > 0 ); return true; } diff --git a/wp-includes/ms-settings.php b/wp-includes/ms-settings.php index 5dd460e301..fe5350079a 100644 --- a/wp-includes/ms-settings.php +++ b/wp-includes/ms-settings.php @@ -126,6 +126,8 @@ if ( !isset( $current_site ) || !isset( $current_blog ) ) { $wpdb->set_prefix( $table_prefix, false ); // $table_prefix can be set in sunrise.php $wpdb->set_blog_id( $current_blog->blog_id, $current_blog->site_id ); $table_prefix = $wpdb->get_blog_prefix(); +$_wp_switched_stack = array(); +$_wp_switched = false; // need to init cache again after blog_id is set wp_start_object_cache(); diff --git a/wp-settings.php b/wp-settings.php index 1e5751fa5b..726e1b06b0 100644 --- a/wp-settings.php +++ b/wp-settings.php @@ -252,6 +252,13 @@ $wp = new WP(); */ $GLOBALS['wp_widget_factory'] = new WP_Widget_Factory(); +/** + * WordPress User Roles + * @global object $wp_roles + * @since 2.0.0 + */ +$GLOBALS['wp_roles'] = new WP_Roles(); + do_action( 'setup_theme' ); // Define the template related constants.