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 call restore_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 call restore_current_blog()
after every switch_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 using switch_to_blog()
. The switched mode function is ms_is_switched()
and it affects wp_upload_dir()
. If wp_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:
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
restore_current_blog();
}