Restore_current_blog () बनाम 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();
 }

अब मैं इसे समझता हूं, मेरे उस जवाब को सही करने के लिए धन्यवाद;) सब कुछ संशोधित कर रहा हूं।
ब्रासोफिलो

जवाबों:


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()urls उत्पन्न करने के लिए काम करता है, लेकिन मैं आपका वचन लेता हूं कि इससे वास्तव में छोटी गाड़ी का व्यवहार होता है। किसी भी स्थिति में, ms_is_switched()मेरे वैकल्पिक दृष्टिकोण का अर्थ है कि फ़ंक्शन अपेक्षा के अनुरूप व्यवहार नहीं करता है और प्लग-इन के साथ-साथ कोर को भी तोड़ सकता है। साभार
स्टीफन हैरिस

1
यदि यह सच है, तो कोडेक्स पेज को restore_current_blog()अपडेट की आवश्यकता है, क्योंकि यह कहता है कि कई स्विच के लिए, किसी को केवल वर्तमान को बचाने $blog_idऔर फिर कई switch_to_blog()कॉल का उपयोग करने की आवश्यकता है।
पैट जे

16

यदि आप कई ब्लॉगों को चलाना चाहते हैं, तो हर बार पिछले ब्लॉग को पुनर्स्थापित करने की कोई आवश्यकता नहीं है। केवल एक चीज जो बढ़ती है वह है $GLOBALS['_wp_switched_stack']- ब्लॉग आईडी के साथ एक सरणी, चिंता की कोई बात नहीं है।

लेकिन ध्यान रखें, दूसरे स्विच के बाद अब restore_current_blog() (!) काम नहीं करेगा , क्योंकि यह पिछले ब्लॉग का उपयोग करता है - जो तब पहला ब्लॉग नहीं था । इसलिए पहले ब्लॉग आईडी को स्टोर करें, और कॉल करें ...

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()था कि सिर्फ पिछले ब्लॉग आईडी और कॉल को क्यों नहीं रीफ़्रेश किया गया switch_to_blog()- कोड स्रोत पर एक संक्षिप्त नज़र और ऐसा लगता है कि कोड दोहराव का एक सा है ...
स्टीफन हैरिस

3
मुझे नहीं लगता कि सीधे ग्लोबल्स को संशोधित करना एक अच्छा विचार है, क्योंकि आप अपने कोड को कोर के इनरल्स को युग्मित कर रहे हैं, जो कि भविष्य का सबूत नहीं है। एपीआई का सही इस्तेमाल करना बेहतर है।
इयान डन

2
@IanDunn रिकॉर्ड के लिए: switch_to_blog()वैसे भी बहुत सीमित (टूटा हुआ) एपीआई है। यदि वर्डप्रेस कभी भी इसे ठीक करता है , तो हमें अपने कोड को वैसे भी रिफलेक्टर करना होगा। और वर्डप्रेस अपने प्रिय ग्लोबल्स को कभी नहीं देगा।
FUXIA

2
@IdDunn I don't think modifying the globals directly is a good idea, कोर डेवलपर्स को लुभाने के लिए यह नहीं बतातीं ;)
एजाज़

1
@JD बेशक, आपको संदर्भ के बारे में पता होना चाहिए। पहले से ही स्विच किए गए राज्य के मामले में आपके पास स्टैक के सही सूचकांक को बनाए रखने के लिए भी हो सकता है। मैं शायद उससे बचने का रास्ता खोजूंगा। दूसरी ओर, इस वर्डप्रेस है, इसलिए कोई दूसरा रास्ता नहीं हो सकता है ...
FUXIA

1

@Toscho जवाब के लिए धन्यवाद। WP की कतार में यह अनुरोध - यहां अपडेट देखें । 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- शामिल / ms-blogs.php )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.