After every instance of switch_to_blog()
you should call restore_current_blog()
to restore the current (actually, previous) blog.
But if you’re looping through two or more blogs and calling switch_to_blog()
on each, is there any reason not to use an additional switch_to_blog()
at the end of the loop to switch to the original blog rather than calling restore_current_blog()
at each pass.
E.g.
Why not:
$original_blog_id = get_current_blog_id();
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
}
switch_to_blog( $original_blog_id );
instead of:
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
restore_current_blog_id();
}
After every instance of
switch_to_blog()
you need to callrestore_current_blog()
otherwise WP will think it is in a “switched” mode and can potentially return incorrect data.If you view the source code for both functions you will see those functions push/pop data into a global called
$GLOBALS['_wp_switched_stack']
. If you do not callrestore_current_blog()
after everyswitch_to_blog()
,$GLOBALS['_wp_switched_stack']
will be non-empty. If$GLOBALS['_wp_switched_stack']
is non-empty WP thinks it is in a switched mode, even if you switched back to the original blog usingswitch_to_blog()
. The switched mode function isms_is_switched()
and it affectswp_upload_dir()
. Ifwp_upload_dir()
thinks it is in a switched mode, it can return data that is incorrect.wp_upload_dir()
builds URLs for the site, so it is a very critical function.This is the correct use:
If you want to run over multiple blogs there is no need to restore the previous blog each time. The only thing that grows is
$GLOBALS['_wp_switched_stack']
â an array with blog IDs, nothing to worry about.But keep in mind,
restore_current_blog()
will not work ( ! ! ! ) anymore after the second switch, because it uses the previous blog â which is not the first blog then. So store the first blog ID, and call â¦â¦ instead of
restore_current_blog()
when you are done. The global variables must be reset, or you will run into the issues mentioned by @user42826.The performance impact is huge. Iâve run some tests on a local installation with 12 sites:
Result:
Using
restore_current_blog()
after each switch doubles the time that is needed just for switching.Thanks to @toscho answer. This request in queue of WP – see updates here. Till that is fixed in WP, if anyone desperately wants to use standard
restore_current_blog()
, then here is another method (please correct if I am wrong):make your function, i.e.
and execute only once when you finish your multiple switches.
(more: wp-includes/ms-blogs.php )