Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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.


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
share|improve this question
Now I understand this, thanks for correcting that answer of mine ;) Am revising everything. –  brasofilo Mar 3 '13 at 10:55

2 Answers 2

up vote 8 down vote accepted

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.

FYI, I ran into this problem using a plugin that used switch_to_blog(). The plugin did not use restore_current_blog() to restore, instead it used switch_to_blog() to switch back to the original site. With the plugin active, all my site urls that were generated were incorrect.

This is the correct use:

 foreach( $blog_ids as $blog_id ){
    switch_to_blog( $blog_id );
    //Do stuff
share|improve this answer
Thanks, I've not had chance to work through the soup of constants & logic that wp_upload_dir() employs to generate urls, but I shall take your word that this does indeed result in buggy behaviour. In any case, the existence of ms_is_switched() means my alternative approach results in the function not behaving as expected and could break plug-ins as well as core. Thanks –  Stephen Harris Nov 17 '13 at 22:59
If this is true, then the Codex page for restore_current_blog() needs an update, since it says that for multiple switches, one need only save the current $blog_id and then use multiple switch_to_blog() calls. –  Pat J Nov 21 '13 at 16:54

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 …

switch_to_blog( $first_blog_id ); 
unset ( $GLOBALS['_wp_switched_stack'] );
$GLOBALS['switched'] = false; 

… instead of restore_current_blog() when you are done.

share|improve this answer
Thought there wasn't any reason not to. Was confused why restore_current_blog() didn't just retrive the previous blog ID and call switch_to_blog() - a brief look at the code source and it seems there's a bit of code duplication... –  Stephen Harris Mar 2 '13 at 20:52
great info. Didn´t know that . Maybe restore_current_blog() should have switched the name to restore_previous_blog(). or maybe change the whole function´s own functionality to operate as a real restore_main_blog(). trac material. –  krembo99 Apr 11 '13 at 3:52
One more thing needs to be set as well: $GLOBALS['switched'] = false;. Although the function ms_is_switched() do check for $GLOBALS['_wp_switched_stack'] but this is introduced since 3.5 and some plugins are still using $GLOBALS['switched'] to see if WP is in switched mode or not. –  Parham Jan 28 '14 at 10:14
@Parham Thanks! I’ve added that to my answer. –  toscho Jan 28 '14 at 10:16
I don't think modifying the globals directly is a good idea, because you're coupling your code to Core's internals, which isn't future-proof. It's better to use the API properly. –  Ian Dunn Sep 29 '14 at 17:17

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.