Make WordPress Core


Ignore:
Timestamp:
08/09/2012 04:28:15 PM (12 years ago)
Author:
ryan
Message:

switch_to_blog() and restore_current_blog() housekeeping.

wp-includes/admin-bar.php:

  • Replace get_admin_url() and get_home_url() with admin_url() and home_url() and place them inside a switch/restore. Likewise replace current_user_can_for_blog() with current_user_can(). This avoids doing multiple switch restores.

wp-includes/ms-blogs.php:

  • Deprecate the $validate argument to switch_to_blog(). This avoids a not very necessary call to get_blog_details(), possibly saving a few queries.
  • Use $_wp_switched and $_wp_switched_stack instead of $switched and $switched_stack to make it less likely these globals will be stomped.
  • Use GLOBALS to access blog_id and other globals. I've preferred this style lately since it makes it obvious a global is being used and avoids global blog_id being stomped by a local variable.
  • Lose some is_object() checks. wp_get_current_user() always returns an object, for example.
  • Call the new WP_Roles::reinit() method.

wp-includes/class-wp-xmlrpc-server.php:

  • Replace current_user_can_for_blog() with current_user_can() and move it inside the switch/restore pair. This eliminates a switch/restore.

wp-includes/capabilities.php:

  • Use array_keys() instead of $role => $data since $data is unused. I *think* this is a bit faster.
  • Introduce WP_Roles::reinit(). This reinitializes WP_Roles and is used after switch_to_blog() has already update the blog ID in the wpdb object. If a global roles array is being used instead of the db, reinit is skipped.
  • current_user_can_for_blog() now does a switch/restore. It didn't before meaning it could be reinitializing the user with the wrong role information for the current blog.

wp-includes/ms-settings.php:

  • Define $_wp_switched_stack and $_wp_switched. This way switch_to_blog() and restore_current_blog() can rely on it being set.

wp-settings.php:

  • Instantiate the WP_Roles global. This was it is always defined during init. To remove the WP_Roles checks from WP_Role and WP_User this would probably have to move before plugins are loaded, which might not be a good thing.

wp-includes/functions.php:

  • Update wp_upload_dir() to reference _wp_switched.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/ms-blogs.php

    r21480 r21485  
    447447 *
    448448 * @param int $new_blog The id of the blog you want to switch to. Default: current blog
    449  * @param bool $validate Whether to check if $new_blog exists before proceeding
     449 * @param bool $deprecated Depecreated argument
    450450 * @return bool True on success, False if the validation failed
    451451 */
    452 function switch_to_blog( $new_blog, $validate = false ) {
    453     global $wpdb, $table_prefix, $blog_id, $switched, $switched_stack, $wp_roles, $wp_object_cache;
    454 
    455     if ( empty($new_blog) )
    456         $new_blog = $blog_id;
    457 
    458     if ( $validate && ! get_blog_details( $new_blog ) )
    459         return false;
    460 
    461     if ( empty($switched_stack) )
    462         $switched_stack = array();
    463 
    464     $switched_stack[] = $blog_id;
     452function switch_to_blog( $new_blog, $deprecated = null ) {
     453    global $wpdb, $wp_roles;
     454
     455    if ( empty( $new_blog ) )
     456        $new_blog = $GLOBALS['blog_id'];
     457
     458    $GLOBALS['_wp_switched_stack'][] = $GLOBALS['blog_id'];
    465459
    466460    /* If we're switching to the same blog id that we're on,
    467461    * set the right vars, do the associated actions, but skip
    468462    * the extra unnecessary work */
    469     if ( $blog_id == $new_blog ) {
    470         do_action( 'switch_blog', $blog_id, $blog_id );
    471         $switched = true;
     463    if ( $new_blog == $GLOBALS['blog_id'] ) {
     464        do_action( 'switch_blog', $new_blog, $new_blog );
     465        $GLOBALS['_wp_switched'] = true;
    472466        return true;
    473467    }
    474468
    475     $wpdb->set_blog_id($new_blog);
    476     $table_prefix = $wpdb->prefix;
    477     $prev_blog_id = $blog_id;
    478     $blog_id = $new_blog;
    479 
    480     if ( is_object( $wp_roles ) ) {
    481         $wpdb->suppress_errors();
    482         if ( method_exists( $wp_roles ,'_init' ) )
    483             $wp_roles->_init();
    484         elseif ( method_exists( $wp_roles, '__construct' ) )
    485             $wp_roles->__construct();
    486         $wpdb->suppress_errors( false );
    487     }
    488 
    489     if ( did_action('init') ) {
     469    $wpdb->set_blog_id( $new_blog );
     470    $GLOBALS['table_prefix'] = $wpdb->prefix;
     471    $prev_blog_id = $GLOBALS['blog_id'];
     472    $GLOBALS['blog_id'] = $new_blog;
     473
     474    if ( did_action( 'init' ) ) {
     475        $wp_roles->reinit();
    490476        $current_user = wp_get_current_user();
    491         if ( is_object( $current_user ) )
    492             $current_user->for_blog( $blog_id );
     477        $current_user->for_blog( $new_blog );
    493478    }
    494479
    495480    if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
    496         wp_cache_switch_to_blog( $blog_id );
     481        wp_cache_switch_to_blog( $new_blog );
    497482    } else {
     483        global $wp_object_cache;
     484
    498485        if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) )
    499486            $global_groups = $wp_object_cache->global_groups;
     
    502489   
    503490        wp_cache_init();
    504         if ( function_exists('wp_cache_add_global_groups') ) {
     491
     492        if ( function_exists( 'wp_cache_add_global_groups' ) ) {
    505493            if ( is_array( $global_groups ) )
    506494                wp_cache_add_global_groups( $global_groups );
    507495            else
    508496                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) );
    509             wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' ));
     497            wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
    510498        }
    511499    }
    512500
    513     do_action('switch_blog', $blog_id, $prev_blog_id);
    514     $switched = true;
     501    do_action( 'switch_blog', $new_blog, $prev_blog_id );
     502    $GLOBALS['_wp_switched'] = true;
     503
    515504    return true;
    516505}
     
    525514 */
    526515function restore_current_blog() {
    527     global $table_prefix, $wpdb, $blog_id, $switched, $switched_stack, $wp_roles, $wp_object_cache;
    528 
    529     if ( !$switched )
     516    global $wpdb, $wp_roles;
     517
     518    if ( ! $GLOBALS['_wp_switched'] )
    530519        return false;
    531520
    532     if ( !is_array( $switched_stack ) )
    533         return false;
    534 
    535     $blog = array_pop( $switched_stack );
    536     if ( $blog_id == $blog ) {
     521    $blog = array_pop( $GLOBALS['_wp_switched_stack'] );
     522
     523    if ( $GLOBALS['blog_id'] == $blog ) {
    537524        do_action( 'switch_blog', $blog, $blog );
    538         /* If we still have items in the switched stack, consider ourselves still 'switched' */
    539         $switched = ( is_array( $switched_stack ) && count( $switched_stack ) > 0 );
     525        // If we still have items in the switched stack, consider ourselves still 'switched'
     526        $GLOBALS['_wp_switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );
    540527        return true;
    541528    }
    542529
    543     $wpdb->set_blog_id($blog);
    544     $prev_blog_id = $blog_id;
    545     $blog_id = $blog;
    546     $table_prefix = $wpdb->prefix;
    547 
    548     if ( is_object( $wp_roles ) ) {
    549         $wpdb->suppress_errors();
    550         if ( method_exists( $wp_roles ,'_init' ) )
    551             $wp_roles->_init();
    552         elseif ( method_exists( $wp_roles, '__construct' ) )
    553             $wp_roles->__construct();
    554         $wpdb->suppress_errors( false );
    555     }
    556 
    557     if ( did_action('init') ) {
     530    $wpdb->set_blog_id( $blog );
     531    $prev_blog_id = $GLOBALS['blog_id'];
     532    $GLOBALS['blog_id'] = $blog;
     533    $GLOBALS['table_prefix'] = $wpdb->prefix;
     534
     535    if ( did_action( 'init' ) ) {
     536        $wp_roles->reinit();
    558537        $current_user = wp_get_current_user();
    559         if ( is_object( $current_user ) )
    560             $current_user->for_blog( $blog_id );
     538        $current_user->for_blog( $blog );
    561539    }
    562540
    563541    if ( function_exists( 'wp_cache_switch_to_blog' ) ) {
    564         wp_cache_switch_to_blog( $blog_id );
     542        wp_cache_switch_to_blog( $blog );
    565543    } else {
     544        global $wp_object_cache;
     545
    566546        if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) )
    567547            $global_groups = $wp_object_cache->global_groups;
     
    570550   
    571551        wp_cache_init();
    572         if ( function_exists('wp_cache_add_global_groups') ) {
     552
     553        if ( function_exists( 'wp_cache_add_global_groups' ) ) {
    573554            if ( is_array( $global_groups ) )
    574555                wp_cache_add_global_groups( $global_groups );
    575556            else
    576557                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) );
    577             wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' ));
     558            wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
    578559        }
    579560    }
    580561
    581     do_action('switch_blog', $blog_id, $prev_blog_id);
    582 
    583     /* If we still have items in the switched stack, consider ourselves still 'switched' */
    584     $switched = ( is_array( $switched_stack ) && count( $switched_stack ) > 0 );
     562    do_action( 'switch_blog', $blog, $prev_blog_id );
     563
     564    // If we still have items in the switched stack, consider ourselves still 'switched'
     565    $GLOBALS['_wp_switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );
     566
    585567    return true;
    586568}
Note: See TracChangeset for help on using the changeset viewer.