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.