restore_current_blog () contre switch_to_blog ()
-
-
Maintenant,je comprends cela,merci d'avoir corrigéma réponse;) Je révisetout.Now I understand this, thanks for correcting that answer of mine ;) Am revising everything.
- 0
- 2013-03-03
- brasofilo
-
3 réponses
- votes
-
- 2013-11-17
Après chaqueinstance de
switch_to_blog()
,vous devez appelerrestore_current_blog()
sinon WPpensera qu'ilesten mode "commuté"et peutpotentiellement renvoyer des donnéesincorrectes.Si vous affichez le code source des deuxfonctions,vous verrez cesfonctionspousser/pop les données dans unglobal appelé
$GLOBALS['_wp_switched_stack']
. Si vousn'appelezpasrestore_current_blog()
après chaqueswitch_to_blog()
,$GLOBALS['_wp_switched_stack']
ne serapas vide. Si$GLOBALS['_wp_switched_stack']
n'estpas vide,WPpense qu'ilesten mode commuté,même si vous êtes revenu aublog d'origineen utilisantswitch_to_blog()
. Lafonction demode commutéestms_is_switched()
et cela affectewp_upload_dir()
. Siwp_upload_dir()
pense qu'ilesten mode commuté,ilpeut renvoyer des donnéesincorrectes.wp_upload_dir()
crée des URLpour le site,c'est donc unefonctiontrès critique.Voici labonne utilisation:
foreach( $blog_ids as $blog_id ){ switch_to_blog( $blog_id ); //Do stuff restore_current_blog(); }
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:
foreach( $blog_ids as $blog_id ){ switch_to_blog( $blog_id ); //Do stuff restore_current_blog(); }
-
Merci,je n'aipaseu la chance detravailler sur la soupe de constanteset de logique que `wp_upload_dir ()` utilisepourgénérer des URL,maisje vous crois surparole que celaentraîneeffectivement un comportementbogué.Danstous les cas,l'existence de `ms_is_switched ()` signifie quemon approche alternative apour résultat que lafonctionne se comportepas commeprévuet pourrait casser lesplug-ins ainsi que lenoyau.MerciThanks, 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
- 0
- 2013-11-17
- Stephen Harris
-
Si celaest vrai,alors lapage Codexpour [`restore_current_blog ()`] (http://codex.wordpress.org/Function_Reference/restore_current_blog) abesoin d'unemise àjour,carelleindique quepourplusieurs commutateurs,il suffit d'enregistrer le courant`$blog_id`puis utilisezplusieurs appels` switch_to_blog () `.If this is true, then the Codex page for [`restore_current_blog()`](http://codex.wordpress.org/Function_Reference/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.
- 1
- 2013-11-21
- Pat J
-
- 2013-03-02
Si vous souhaitezparcourirplusieursblogs,iln'estpasnécessaire de restaurer leblogprécédent à chaquefois. La seule chose quigranditest
$GLOBALS['_wp_switched_stack']
- untableau avec desidentifiants deblog,rien à craindre.Maisgardez à l'esprit que
restore_current_blog()
ne fonctionneraplus (!!!) après le deuxième changement,caril utilise leblogprécédent - quin'estpas le premier blogensuite. Alors stockez lepremier ID debloget appelez…switch_to_blog( $first_blog_id ); unset ( $GLOBALS['_wp_switched_stack'] ); $GLOBALS['switched'] = false;
… au lieu de
restore_current_blog()
lorsque vous avezterminé. Les variablesglobales doivent être réinitialisées,sinon vous rencontrerez lesproblèmesmentionnéspar @ user42826.L'impact sur lesperformancesest énorme. J'aieffectué destests sur uneinstallation locale avec 12 sites:
$sites = wp_get_sites(); print '<pre>' . count( $sites ) . " sites\n"; timer_start(); print 'With restore_current_blog(): '; foreach ( $sites as $site ) { switch_to_blog( $site[ 'blog_id' ] ); restore_current_blog(); } timer_stop( 1, 9 ); print "\nWithout restore_current_blog(): "; timer_start(); $current_site = get_current_blog_id(); foreach ( $sites as $site ) { switch_to_blog( $site[ 'blog_id' ] ); } switch_to_blog( $current_site ); $GLOBALS['_wp_switched_stack'] = array(); $GLOBALS['switched'] = FALSE; timer_stop( 1, 9 ); print '</pre>';
Résultat:
12 sites With restore_current_blog(): 0.010648012 Without restore_current_blog(): 0.005203962
L'utilisation de
restore_current_blog()
après chaque changement double letempsnécessaire uniquementpour la commutation.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. 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:
$sites = wp_get_sites(); print '<pre>' . count( $sites ) . " sites\n"; timer_start(); print 'With restore_current_blog(): '; foreach ( $sites as $site ) { switch_to_blog( $site[ 'blog_id' ] ); restore_current_blog(); } timer_stop( 1, 9 ); print "\nWithout restore_current_blog(): "; timer_start(); $current_site = get_current_blog_id(); foreach ( $sites as $site ) { switch_to_blog( $site[ 'blog_id' ] ); } switch_to_blog( $current_site ); $GLOBALS['_wp_switched_stack'] = array(); $GLOBALS['switched'] = FALSE; timer_stop( 1, 9 ); print '</pre>';
Result:
12 sites With restore_current_blog(): 0.010648012 Without restore_current_blog(): 0.005203962
Using
restore_current_blog()
after each switch doubles the time that is needed just for switching.-
Jepensais qu'iln'y avait aucune raison dene pas lefaire.Jene savaispaspourquoi `restore_current_blog ()`ne récupéraitpas simplement l'ID deblogprécédentet appelait `switch_to_blog ()` - unbref aperçu de la source du codeet il semble qu'il y ait unpeu de duplication de code ...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...
- 0
- 2013-03-02
- Stephen Harris
-
superinfo.Jene savaispas ça.Peut-être que `restore_current_blog ()` aurait dû changer lenomen `restore_previous_blog ()`.oupeut-être changertoute lafonctionnalité de lafonctionpour qu'ellefonctionne comme un véritable `restore_main_blog ()`.matériautrac.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.
- 0
- 2013-04-11
- krembo99
-
Une autre chose doit également être définie: `$ GLOBALS ['switch']=false;`.Bien que lafonction `ms_is_switched ()` vérifie `$ GLOBALS ['_ wp_switched_stack']`mais celaestintroduit depuis 3.5et certainsplugins utilisenttoujours `$ GLOBALS ['commuté']`pour voir si WPesten mode commuté ounepas.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.
- 0
- 2014-01-28
- Parham
-
Jene pensepas que lamodification directe desglobaux soit unebonneidée,car vous couplez votre code aux composantsinternes de Core,ce quin'estpas à l'épreuve dutemps.Ilestpréférable d'utiliser correctement l'API.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.
- 3
- 2014-09-29
- Ian Dunn
-
@IanDunn Justepourmémoire: `switch_to_blog ()`est detoutefaçon une APItrès limitée (cassée).Si WordPress corrige unjour _que_,nous devons detoutefaçon refactorisernotre code.Et WordPressn'abandonnerajamais sesbien-aimésglobaux.@IanDunn Just for the record: `switch_to_blog()` is a very limited (broken) API anyway. If WordPress ever fixes _that_, we have to refactor our code anyway. And WordPress will never give up its beloved globals.
- 2
- 2015-02-02
- fuxia
-
des conseils liés à cela quigâchent l'identifiant dublog ..... NE JAMAIS appeler une variable `$blog_id` ou vous alleztoutgâcher!advice related to this that messes up blog ID..... NEVER call a variable `$blog_id` or you will mess up everything!
- 0
- 2015-07-01
- Jacob Raccuia
-
@JacobRaccuia Non,ne créezpas de variablesglobales.Ensuite,vouspouvez utilisertous lesnoms que vous souhaitez.@JacobRaccuia Nope, just don't create global variables. Then you can use every name you want.
- 0
- 2015-07-01
- fuxia
-
@toscho c'est ce queje pensais,maisj'avais défini une variableplus haut sur lapage appelée `$blog_id=2`et cela agâchémaboucleet fait que`get_current_blog_id` renvoie 2 au lieu de 1 (quandj'étais sur 1).Je l'ai corrigéen changeantmon `$blog_id`en` $blogID`.La seule raisonpour laquelleje savaisfaire cela étaitparce quej'avais l'habitude deparcourir une liste `foreach ($post as $blog_id=> $ v)`et d'envoyer `$blog_id` dans` switch_to_blog () `nefonctionnepasnonplus.@toscho that's what I thought, but I had set a variable higher up on the page called `$blog_id = 2` and it messed up my loop and caused `get_current_blog_id` to return 2 instead of 1 (when I was on 1). I fixed it by changing my `$blog_id` to `$blogID`. The only reason I knew to do this was because I used to loop through a list `foreach($post as $blog_id => $v)` and sending `$blog_id` into `switch_to_blog()` doesn't work either.
- 0
- 2015-07-01
- Jacob Raccuia
-
@IanDunn `Jene pensepas quemodifier directement lesglobaux soit unebonneidée`,ne le ditespas aux développeursprincipaux de wp;)@IanDunn `I don't think modifying the globals directly is a good idea`, don't tell that to wp core developers ;)
- 2
- 2016-02-02
- Ejaz
-
Jepense que vous devriezmentionner que vous devez sauvegarderet restaurer lesglobaux au lieu de simplement les réinitialiser si vousne savezpas si WordPress aurait déjàpu êtrebasculé vers un autreblog avant de commencer.I think that you should mention that you need to back up and restore the globals instead of just resetting them if you don't know whether or not WordPress could have already been switched to another blog before you start.
- 0
- 2016-07-20
- J.D.
-
@ J.D.Bien sûr,vous devez être conscient du contexte.Dans le cas d'un état déjà commuté,vous devrezpeut-êtremêmemaintenir l'index correct de lapile.Je chercheraisprobablement unmoyen d'éviter cela.D'un autre côté,c'est WordPress,donciln'y apeut-êtrepas d'autremoyen ...@J.D. Of course, you need to be context aware. In the case of an already switched state you might have even to maintain the correct index of the stack. I would probably search for a way to avoid that. On the other hand, this is WordPress, so there might be no other way …
- 1
- 2016-07-20
- fuxia
-
@toschopeut-être que c'est unebonneidée si vousfaites ceci: http://pastebin.com/raw/R2H6N0t3et exécutez une seulefois après laboucle (donc,ilne serapasnécessaire d'exécuter desfonctions supplémentaires,c'est-à-dire `get_current_blog_id` avant lesboucles)@toscho maybe it's good idea if you do this: http://pastebin.com/raw/R2H6N0t3 and execute only once after loop (so, there will be no need to run extra functions, i.e. `get_current_blog_id` before the loops )
- 0
- 2016-09-08
- T.Todua
-
- 2016-09-08
Merci à @toscho answer.Cette requête dans lafile d'attente de WP - voir lesmises àjour ici .Jusqu'à ce que cela soit corrigé dans WP,si quelqu'un veut désespérément utiliser lanorme
restore_current_blog()
,alors voici une autreméthode (veuillez corriger sije metrompe):faites votrefonction,c'est-à-dire
function restore_original_blog_X(){ if(!empty(($GLOBALS['_wp_switched_stack'][0])){ $GLOBALS['blog_id']= $GLOBALS['_wp_switched_stack'][0]; $GLOBALS['_wp_switched_stack'] = array($GLOBALS['_wp_switched_stack'][0]); restore_current_blog(); } }
et exécutez une seulefois lorsque vous avezterminé vosmultiples commutations. (plus: wp-includes/ms-blogs.php )
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.
function restore_original_blog_X(){ if(!empty(($GLOBALS['_wp_switched_stack'][0])){ $GLOBALS['blog_id']= $GLOBALS['_wp_switched_stack'][0]; $GLOBALS['_wp_switched_stack'] = array($GLOBALS['_wp_switched_stack'][0]); restore_current_blog(); } }
and execute only once when you finish your multiple switches. (more: wp-includes/ms-blogs.php )
Après chaqueinstance de
switch_to_blog()
,vous devez appelerrestore_current_blog()
pour restaurer leblog actuel (enfait,précédent).Mais si vousparcourez aumoins deuxblogset que vous appelez
switch_to_blog()
sur chacun d'eux,y a-t-il une raison non d'utiliser unswitch_to_blog()
à lafin de labouclepourpasser aublog d'origineplutôt que d'appelerrestore_current_blog()
à chaquepassage.Parexemple
Pourquoipas:
au lieu de: