restore_current_blog () vs switch_to_blog ()


23

Her örneğinizden sonra mevcut (önceki, önceki) blogu geri yüklemek için switch_to_blog()aramalısınız restore_current_blog().

İki veya daha fazla bloglar arasında döngü ve aradığınız Ama switch_to_blog()her biri üzerinde, herhangi bir neden yoktur değil ek kullanmak switch_to_blog()yerine çağırmaktan daha özgün bloga geçmek için döngünün sonunda restore_current_blog()her geçişte.

Örneğin

Neden olmasın:

 $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 );

yerine:

 foreach( $blog_ids as $blog_id ){
    switch_to_blog( $blog_id );
    //Do stuff
    restore_current_blog_id();
 }

Şimdi bunu anlıyorum, cevabımı düzelttiğin için teşekkürler;) Her şeyi revize ediyorum.
— brasofilo

Yanıtlar:


19

Her örneği sonra switch_to_blog()size ihtiyacım aramaya restore_current_blog()aksi WP, bir "açık" modunda düşünecek ve potansiyel olarak yanlış veriler döndürebilir.

Her iki fonksiyonun kaynak kodunu görüyorsanız, bu fonksiyonların global olarak çağrılan / pop verilerini göreceksiniz $GLOBALS['_wp_switched_stack']. Her şeyden restore_current_blog()sonra aramazsanız switch_to_blog(), $GLOBALS['_wp_switched_stack']boş olmaz. $GLOBALS['_wp_switched_stack']Boş değilse , WP kullanarak önceki blog’a geçseniz bile, bunun açık bir modda olduğunu düşünüyor switch_to_blog(). Anahtarlamalı mod işlevi ms_is_switched()ve onu etkiler wp_upload_dir(). Eğer wp_upload_dir()bir anahtarlamalı modda olduğunu düşünmektedir, bu yanlış veri döndürebilir. wp_upload_dir()site için URL'ler oluşturur, bu nedenle çok kritik bir işlevdir.

Bu doğru kullanım:

 foreach( $blog_ids as $blog_id ){
    switch_to_blog( $blog_id );
    //Do stuff
    restore_current_blog();
 }

Teşekkürler, wp_upload_dir()url üretmek için kullanılan sabitler ve mantık çorbasıyla çalışma şansım olmadı , ama bunun gerçekten buggy davranışına yol açtığını söyleyeceğim. Her durumda, ms_is_switched()alternatif yaklaşımımın varlığı , işlevin beklendiği gibi davranmamasına ve eklentilerin yanı sıra çekirdeği de kırabileceği anlamına gelir. Teşekkürler
— Stephen Harris

1
Eğer bu doğruysa, o zaman Kodeks sayfasının restore_current_blog()bir güncellemeye ihtiyacı vardır, çünkü birden fazla anahtar için sadece birinin mevcut kaydı kaydetmesi $blog_idve daha sonra birden fazla switch_to_blog()çağrı kullanması gerekir .
— Pat J

16

Birden fazla blog üzerinden çalıştırmak istiyorsanız, önceki blog'u her defasında geri yüklemenize gerek yoktur. Büyüyen tek şey $GLOBALS['_wp_switched_stack']- blog kimliğine sahip bir dizi, endişelenecek bir şey yok.

Ancak aklınızda bulundurun, ikinci anahtardan sonra artık restore_current_blog() çalışmaz (!!!) , Çünkü önceki blogu kullanır - ki o zaman ilk blog değildir . Öyleyse ilk blog kimliğini sakla ve ara…

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

… Bittiğinde yerine restore_current_blog(). Genel değişkenler sıfırlanmalıdır, yoksa @ user42826 tarafından belirtilen sorunlara rastlarsınız.

Performansın etkisi çok büyük. Yerel bir kurulumda 12 siteyle bazı testler yaptım:

$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>';

Sonuç:

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

restore_current_blog()Her anahtardan sonra kullanılması , sadece anahtarlama için gereken süreyi iki katına çıkarır.


Yapmamak için bir sebep olmadığını düşündüm. Neden restore_current_blog()sadece önceki blog kimliğini ve çağrıyı geri almadı? switch_to_blog()- kod kaynağına kısa bir bakış ve kod çoğaltmanın bir kısmı varmış gibi görünüyor ...
— Stephen Harris

3
Globalleri doğrudan değiştirmenin iyi bir fikir olduğunu düşünmüyorum, çünkü kodunuzu Core'un içindekilerine bağlıyorsunuz, ki bunlar gelecekteki kanıtı değil. API'yi doğru kullanmak daha iyidir.
— Ian Dunn

2
@IanDunn Sadece kayıt için: switch_to_blog()yine de çok sınırlı (kırık) bir API. WordPress hiç düzeltmeleri varsa , biz yine kodumuzu refactor zorundayız. Ve WordPress, sevgili dünyalarından asla vazgeçmeyecek.
— fuxia

2
@ IanDunn I don't think modifying the globals directly is a good idea, çekirdek geliştiriciler wp söyleme;)
— Ejaz

1
@JD Elbette, içeriğin farkında olmanız gerekir. Önceden anahtarlanmış bir durumda, yığının doğru endeksini korumanız bile gerekebilir. Muhtemelen bundan kaçınmanın bir yolunu arardım. Öte yandan, bu WordPress, bu yüzden başka bir yolu olmayabilir…
— fuxia

1

@Toscho cevabı için teşekkürler. WP sırasındaki bu istek - burada güncellemeleri görün . WP’de sabit olana kadar, eğer birisi çaresizce standart kullanmak isterse restore_current_blog(), o zaman burada başka bir yöntem var (lütfen yanılıyorsam düzeltin):

işini yap, yani

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

}

ve birden fazla anahtarınızı bitirdiğinizde yalnızca bir kez uygulayın. (daha fazlası: wp-include / ms-blogs.php )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.