restore_current_blog () vs switch_to_blog ()

22

Após cada instância de switch_to_blog() você deve ligar para restore_current_blog() para restaurar a atual (na verdade, anterior) blog.

Mas se você estiver circulando dois ou mais blogs e chamando switch_to_blog() em cada um deles, existe alguma razão não para usar um switch_to_blog() adicional no final do loop para alternar para o blog original em vez de chamar restore_current_blog() em 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 );

em vez de:

 foreach( $blog_ids as $blog_id ){
    switch_to_blog( $blog_id );
    //Do stuff
    restore_current_blog_id();
 }
    
por Stephen Harris 02.03.2013 / 21:37
fonte

3 respostas

18

Após cada instância de switch_to_blog() você precisa para chamar restore_current_blog() , caso contrário o WP pensará que está em um modo "comutado" e poderá retornar dados incorretos.

Se você visualizar o código-fonte para as duas funções, verá essas funções de dados push / pop em um global chamado $GLOBALS['_wp_switched_stack'] . Se você não chamar restore_current_blog() após cada switch_to_blog() , $GLOBALS['_wp_switched_stack'] será não vazio. Se $GLOBALS['_wp_switched_stack'] não estiver vazio, o WP acha que está em um modo comutado, mesmo que você tenha alternado para o blog original usando switch_to_blog() . A função do modo comutado é ms_is_switched() e afeta wp_upload_dir() . Se wp_upload_dir() achar que está em um modo comutado, ele poderá retornar dados incorretos. wp_upload_dir() cria URLs para o site, por isso é uma função muito importante.

FYI, encontrei esse problema usando um plug-in que usou switch_to_blog() . O plug-in não usou restore_current_blog() para restaurar, em vez disso, usou switch_to_blog() para voltar ao site original. Com o plug-in ativo, todos os URLs do meu site que foram gerados estavam incorretos.

Este é o uso correto:

 foreach( $blog_ids as $blog_id ){
    switch_to_blog( $blog_id );
    //Do stuff
    restore_current_blog();
 }
    
por user42826 17.11.2013 / 05:27
fonte
16

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 tenha em mente que restore_current_blog() não funcionará mais após o segundo switch, porque ele usa o blog anterior - que não é o primeiro blog. Então, armazene o primeiro ID do blog e chame…

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

… 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. Fiz alguns testes em uma instalação local com 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>';

Resultado:

12 sites
With restore_current_blog():    0.010648012
Without restore_current_blog(): 0.005203962

Usando restore_current_blog() após cada switch dobra o tempo necessário apenas para alternar.

    
por fuxia 02.03.2013 / 21:46
fonte
1

Graças à resposta do @toscho. Este pedido na fila do WP - veja as atualizações aqui . Até que isso seja corrigido no WP, se alguém quiser usar o padrão restore_current_blog() , então aqui está outro método (corrija se eu estiver errado):

faça a sua função, por exemplo

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();
    }

}

e execute apenas uma vez quando você terminar seus múltiplos switches. (mais: wp-includes / ms-blogs.php )

    
por T.Todua 08.09.2016 / 10:07
fonte

Tags