restore_current_blog () vs switch_to_blog ()


23

모든 인스턴스가 끝나면 현재 (실제로 이전) 블로그를 복원하도록 switch_to_blog()호출해야합니다 restore_current_blog().

그러나 두 개 이상의 블로그를 반복 switch_to_blog()하고 각 블로그를 호출 하는 경우 각 패스에서 호출하는 대신 루프 끝에 추가 블로그를 사용하여 원래 블로그로 전환 하지 않는 이유 가 있습니다 .switch_to_blog()restore_current_blog()

예 :

왜 안되 겠어요 :

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

이제 나는 내 대답을 수정 해 주셔서 감사합니다.;) 모든 것을 수정하고 있습니다.
brasofilo

답변:


19

의 모든 인스턴스 후 switch_to_blog()당신이 필요로 전화를 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();
 }

감사합니다, wp_upload_dir()URL을 생성 하는 데 사용되는 상수 및 논리 수프를 통해 작업 할 기회 는 없었지만 이것이 실제로 버그가있는 행동을 초래한다는 말을 들겠습니다. 어쨌든, 존재하는 ms_is_switched()대안 접근 방식은 기능이 예상대로 작동하지 않고 플러그인뿐만 아니라 코어를 손상시킬 수 있음을 의미합니다. 감사합니다
Stephen Harris

1
이것이 사실이라면 restore_current_blog()여러 스위치의 경우 전류를 저장 $blog_id한 다음 여러 switch_to_blog()호출 을 사용해야 하므로 코덱 페이지 에서 업데이트가 필요 합니다.
Pat J

16

여러 블로그를 실행하려면 매번 이전 블로그를 복원 할 필요가 없습니다. 성장하는 유일한 것은 $GLOBALS['_wp_switched_stack']블로그 ID를 가진 배열이며 걱정할 필요가 없습니다.

그러나 두 번째 스위치 이후에는 더 이상 restore_current_blog() 작동하지 않습니다 (!!!). 이전 블로그를 사용하기 때문에 첫 번째 블로그 가 아니기 때문 입니다. 첫 번째 블로그 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()각 스위치 후에 사용하면 전환에 필요한 시간이 두 배가됩니다.


하지 말아야 할 이유가 없다고 생각했습니다. restore_current_blog()이전 블로그 ID를 검색하지 않고 호출 한 이유가 혼란 스러웠 switch_to_blog()습니다. 코드 소스를 간단히 살펴보면 약간의 코드 중복이있는 것 같습니다.
Stephen Harris

3
코드를 Core의 내부에 결합하고 있기 때문에 전역을 직접 수정하는 것은 좋은 생각이 아닙니다. 미래에는 확실하지 않습니다. API를 올바르게 사용하는 것이 좋습니다.
Ian Dunn

2
@IanDunn 단지 기록을 위해 : switch_to_blog()어쨌든 매우 제한된 (깨진) API입니다. WordPress에서 문제를 해결 하는 경우 어쨌든 코드를 리팩터링해야합니다. 그리고 WordPress는 사랑하는 세계를 포기하지 않을 것입니다.
fuxia

2
@IanDunn I don't think modifying the globals directly is a good idea, 핵심 개발자를 wp하라고 말하지 말라;)
Ejaz

1
@JD 물론 상황 인식이 필요합니다. 이미 전환 된 상태의 경우 올바른 스택 인덱스를 유지해야 할 수도 있습니다. 아마 그것을 피할 수있는 방법을 찾고있을 것입니다. 반면에, 이것은 워드 프레스이므로 다른 방법은 없을 것입니다…
fuxia

1

@toscho 답변 감사합니다. WP 대기열의이 요청은 여기 업데이트를 참조 하십시오 . 누군가가 필사적으로 standard을 사용하고 싶다면 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();
    }

}

여러 스위치를 완료하면 한 번만 실행하십시오. (more : wp-includes / ms-blogs.php )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.