it-swarm.com.de

restore_current_blog () vs switch_to_blog ()

Nach jeder Instanz von switch_to_blog() sollten Sie restore_current_blog() aufrufen, um das aktuelle (tatsächlich vorherige) Blog wiederherzustellen.

Wenn Sie jedoch zwei oder mehr Blogs durchlaufen und jeweils switch_to_blog() aufrufen, gibt es einen Grund, nicht am Ende der Schleife eine zusätzliche switch_to_blog() zu verwenden, um zum ursprünglichen Blog zu wechseln, anstatt restore_current_blog() bei aufzurufen jeder Durchgang.

Z.B.

Warum nicht:

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

anstatt:

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

Nach jeder Instanz von switch_to_blog() müssen Sieaufrufen, um restore_current_blog() aufzurufen. Andernfalls wird WP denken, dass es sich in einem "geschalteten" Modus befindet und möglicherweise falsche Daten zurückgeben kann.

Wenn Sie den Quellcode für beide Funktionen anzeigen, werden diese Funktionen angezeigt. Push/Pop-Daten werden in einem globalen Code namens $GLOBALS['_wp_switched_stack'] abgelegt. Wenn Sie restore_current_blog() nicht nach jeder switch_to_blog() aufrufen, ist $GLOBALS['_wp_switched_stack'] nicht leer. Wenn $GLOBALS['_wp_switched_stack'] nicht leer ist WP denkt, dass es sich um einen umgeschalteten Modus handelt, auch wenn Sie mit switch_to_blog() zum ursprünglichen Blog zurückgeschaltet haben. Die Schaltmodusfunktion ist ms_is_switched() und betrifft wp_upload_dir() . Wenn wp_upload_dir() denkt, dass es sich um einen Switched-Modus handelt, können falsche Daten zurückgegeben werden. wp_upload_dir() erstellt URLs für die Site, daher ist dies eine sehr wichtige Funktion.

Zu Ihrer Information, ich bin auf dieses Problem mit einem Plugin gestoßen, das switch_to_blog() verwendet hat. Das Plugin hat nicht restore_current_blog() zum Wiederherstellen verwendet, sondern switch_to_blog(), um zur ursprünglichen Site zurückzukehren. Bei aktiviertem Plugin waren alle generierten URLs meiner Website falsch.

Dies ist die richtige Verwendung:

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

Wenn Sie mehrere Blogs durchsuchen möchten, müssen Sie das vorherige Blog nicht jedes Mal wiederherstellen. Das einzige, was wächst, ist $GLOBALS['_wp_switched_stack'] - ein Array mit Blog-IDs, über das Sie sich keine Sorgen machen müssen.

Beachten Sie jedoch, dass restore_current_blog() nach dem zweiten Wechsel nicht mehr funktioniert, da das vorherige Blog verwendet wird - das dann nicht das first - Blog ist. Speichern Sie also die erste Blog-ID und rufen Sie an…

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

... anstelle von restore_current_blog(), wenn Sie fertig sind. Die globalen Variablen müssen zurückgesetzt werden, sonst treten die von @ user42826 genannten Probleme auf.

Die Auswirkungen auf die Leistung sind enorm. Ich habe einige Tests auf einer lokalen Installation mit 12 Standorten durchgeführt:

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

Ergebnis:

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

Die Verwendung von restore_current_blog() nach jedem Wechsel verdoppelt die Zeit, die nur für den Wechsel benötigt wird.

16
fuxia

Danke an @toscho Antwort. Diese Anfrage in der Warteschlange von WP - siehe Updates hier . Bis das in WP behoben ist, wenn jemand verzweifelt Standard restore_current_blog() verwenden möchte, dann ist hier eine andere Methode (bitte korrigieren, wenn ich falsch liege):

machen Sie Ihre Funktion, d.h.

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

}

und nur einmal ausführen, wenn Sie Ihre mehreren Schalter beendet haben. (mehr: wp-includes/ms-blogs.php )

1
T.Todua