RESTORE_CURRENT_BLOG()与Switch_to_Blog()

时间:2013-03-02 作者:Stephen Harris

每次switch_to_blog() 你应该打电话restore_current_blog() 还原当前(实际上是上一个)博客。

但是如果你在两个或更多的博客上循环switch_to_blog() 是否有任何理由不使用额外的switch_to_blog() 在循环结束时切换到原始博客,而不是调用restore_current_blog() 每次通过时。

E、 g。

为什么不:

 $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 );
而不是:

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

3 个回复
最合适的回答,由SO网友:user42826 整理而成

每次switch_to_blog()need 调用restore_current_blog() 否则,WP会认为它处于“切换”模式,并可能返回不正确的数据。

如果查看这两个函数的源代码,您将看到这些函数将数据推送/弹出到一个名为$GLOBALS[\'_wp_switched_stack\']. 如果你不打电话restore_current_blog() 之后switch_to_blog(), $GLOBALS[\'_wp_switched_stack\'] 将为非空。如果$GLOBALS[\'_wp_switched_stack\'] 非空WP认为它处于切换模式,即使您使用switch_to_blog(). 切换模式功能为ms_is_switched() 它会影响wp_upload_dir(). 如果wp_upload_dir() 如果它处于切换模式,则可能返回不正确的数据。wp_upload_dir() 为站点构建URL,因此这是一个非常关键的功能。

这是正确的用法:

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

SO网友:fuxia

如果要运行多个博客,则无需每次都恢复以前的博客。唯一增长的是$GLOBALS[\'_wp_switched_stack\'] – 一个带有博客ID的数组,无需担心。

但请记住,restore_current_blog() will not work ( ! ! ! ) 在第二次切换之后,因为它使用的是上一个博客,而不是第一个博客。所以存储第一个博客ID,然后调用…

switch_to_blog( $first_blog_id ); 
unset ( $GLOBALS[\'_wp_switched_stack\'] );
$GLOBALS[\'switched\'] = false; 
…而不是restore_current_blog() 完成后。必须重置全局变量,否则您将遇到@user42826提到的问题。

对性能的影响是巨大的。我在本地安装的12个站点上运行了一些测试:

$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>\';
结果:

12 sites
With restore_current_blog():    0.010648012
Without restore_current_blog(): 0.005203962
使用restore_current_blog() 每次切换后,只需将切换所需的时间加倍。

SO网友:T.Todua

感谢@toscho answer。WP队列中的此请求-请参阅更新here. 在WP中确定之前,如果有人拼命想使用标准restore_current_blog(), 那么这里有另一种方法(如果我错了,请更正):

发挥你的作用,即。

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

}
并且在完成多个开关时只执行一次。(更多信息:wp-includes/ms-blogs.php )

结束

相关推荐

WP MultiSite:默认添加关于博客创建的页面

我希望在使用WP Multisite创建新站点时,在默认情况下添加一个页面。因此,我有一个创建两个页面的函数:function my_default_pages() { $default_pages = array(\'Impress\', \'Contact\'); $existing_pages = get_pages(); foreach($existing_pages as $page) { $temp[] = $p