Depois de cada instância, switch_to_blog()
você deve ligar restore_current_blog()
para restaurar o blog atual (na verdade, anterior).
Mas se você estiver percorrendo dois ou mais blogs e ligando switch_to_blog()
para cada um deles, existe algum motivo para não usar um adicional switch_to_blog()
no final do loop para alternar para o blog original em vez de ligar restore_current_blog()
a cada passagem.
Por exemplo
Por que não:
$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 );
ao invés de:
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
restore_current_blog_id();
}
Respostas:
Depois de cada instância que
switch_to_blog()
você precisar chamar, orestore_current_blog()
WP pensará que está no modo "alternado" e pode potencialmente retornar dados incorretos.Se você visualizar o código fonte das duas funções, verá essas funções enviar / inserir dados em uma chamada global
$GLOBALS['_wp_switched_stack']
. Se você não ligarrestore_current_blog()
depois de cadaswitch_to_blog()
,$GLOBALS['_wp_switched_stack']
não estará vazio. Se$GLOBALS['_wp_switched_stack']
não estiver vazio, o WP acha que está no modo alternado, mesmo que você tenha retornado ao blog original usandoswitch_to_blog()
. A função de modo comutado éms_is_switched()
e afetawp_upload_dir()
. Sewp_upload_dir()
pensa que está no modo comutado, pode retornar dados incorretos.wp_upload_dir()
cria URLs para o site, por isso é uma função muito crítica.Este é o uso correto:
fonte
wp_upload_dir()
empregada para gerar URLs, mas devo dizer que isso realmente resulta em comportamento de buggy. De qualquer forma, a existência dems_is_switched()
significa que minha abordagem alternativa faz com que a função não se comporte conforme o esperado e pode interromper os plug-ins e também o núcleo. Obrigadorestore_current_blog()
precisa de uma atualização, pois diz que, para vários comutadores, é necessário salvar apenas o atual$blog_id
e usar váriasswitch_to_blog()
chamadas.Se você deseja executar vários blogs, não há necessidade de restaurar o blog anterior a cada vez. A única coisa que cresce é
$GLOBALS['_wp_switched_stack']
- uma matriz com IDs de blog, nada para se preocupar.Mas lembre-
restore_current_blog()
se de que não funcionará mais (!!!) Após a segunda opção, porque ele usa o blog anterior - que não é o primeiro blog da época. Portanto, armazene o primeiro ID do blog e ligue para…... em vez de
restore_current_blog()
quando terminar. As variáveis globais devem ser redefinidas ou você encontrará os problemas mencionados por @ user42826.O impacto no desempenho é enorme. Eu executei alguns testes em uma instalação local com 12 sites:
Resultado:
O uso
restore_current_blog()
após cada opção duplica o tempo necessário apenas para a troca.fonte
restore_current_blog()
não apenas retrive o ID do blog anterior e chamadaswitch_to_blog()
- um olhar breve na fonte de código e parece que há um pouco de duplicação de código ...switch_to_blog()
é uma API muito limitada (quebrada) de qualquer maneira. Se o WordPress resolver isso , precisamos refatorar nosso código de qualquer maneira. E o WordPress nunca desistirá de seus amados globais.I don't think modifying the globals directly is a good idea
, não diga isso para desenvolvedores do núcleo wp;)Graças à resposta @toscho. Esta solicitação na fila do WP - veja as atualizações aqui . Até que seja consertado no WP, se alguém quiser desesperadamente usar o padrão
restore_current_blog()
, aqui está outro método (corrija se estiver errado):faça sua função, ou seja
e execute apenas uma vez quando terminar seus vários comutadores. (mais: wp-includes / ms-blogs.php )
fonte