পুনরুদ্ধার_কালীন_ব্লগ () বনাম স্যুইচ_টো_ব্লগ ()


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()অন্যথায় ডাব্লু মনে হবে এটি একটি "সুইচ" মোডে রয়েছে এবং সম্ভাব্য ভুল তথ্য ফিরে আসতে পারেন।

যদি আপনি উভয় ফাংশনের জন্য সোর্স কোডটি দেখতে পান তবে আপনি সেই ফাংশনগুলিকে বিশ্বব্যাপী ডাকা / পপ ডেটা দেখতে পাবেন $GLOBALS['_wp_switched_stack']। আপনাকে কল না থাকে তাহলে restore_current_blog()প্রত্যেক পর switch_to_blog(), $GLOBALS['_wp_switched_stack']খালি নয় এমন হতে হবে। যদি $GLOBALS['_wp_switched_stack']খালি খালি না হয় তবে ডাব্লুপি মনে করে এটি একটি সুইচড মোডে রয়েছে, এমনকি আপনি যদি ব্যবহার করে মূল ব্লগে ফিরে যান তবে switch_to_blog()। সুইচড মোড ফাংশনটি হয় ms_is_switched()এবং এটি প্রভাবিত করে wp_upload_dir()। যদি wp_upload_dir()মনে হয় এটি একটি স্যুইচড মোডে রয়েছে, তবে এটি ভুল যা ডেটা ফেরত দিতে পারে। wp_upload_dir()সাইটের জন্য ইউআরএল তৈরি করে, তাই এটি একটি অত্যন্ত সমালোচনামূলক কাজ।

এটি সঠিক ব্যবহার:

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

ধন্যবাদ, আমার wp_upload_dir()কাছে ইউআরএল তৈরির কাজে নিযুক্ত কনস্ট্যান্টস এবং লজিকের স্যুপ দিয়ে কাজ করার সুযোগ হয়নি , তবে আমি আপনার কথাটি গ্রহণ করব যে এটি সত্যই বগী আচরণের ফলে আসে does যাইহোক, অস্তিত্বের ms_is_switched()অর্থ আমার বিকল্প পদ্ধতির ফলশ্রুতিতে প্রত্যাশা অনুযায়ী আচরণ না করার ফলাফল এবং মূল পাশাপাশি প্লাগ-ইনগুলি ভেঙে দিতে পারে। ধন্যবাদ
স্টিফেন হ্যারিস

1
যদি এটি সত্য হয়, তবে কোডেক্স পৃষ্ঠার জন্য restore_current_blog()একটি আপডেট দরকার, যেহেতু এটি বলে যে একাধিক স্যুইচের জন্য, কেবলমাত্র বর্তমানটিকে সংরক্ষণ করতে হবে $blog_idএবং তারপরে একাধিক switch_to_blog()কল ব্যবহার করা উচিত ।
প্যাট জে

16

আপনি যদি একাধিক ব্লগ চালাতে চান তবে প্রতিবার আগের ব্লগটি পুনরুদ্ধার করার দরকার নেই। কেবল বেড়ে ওঠা একটাই $GLOBALS['_wp_switched_stack']- ব্লগ আইডি সহ একটি অ্যারে, উদ্বিগ্ন হওয়ার কিছু নেই nothing

তবে মনে রাখবেন, দ্বিতীয় স্যুইচের পরে আর restore_current_blog() (!!) কাজ করবে না কারণ এটি পূর্ববর্তী ব্লগটি ব্যবহার করে - যা তখন প্রথম ব্লগ নয় । সুতরাং প্রথম ব্লগ আইডি সঞ্চয় করুন এবং কল করুন ...

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

restore_current_blog()আপনি হয়ে গেলে এর পরিবর্তে । গ্লোবাল ভেরিয়েবলগুলি অবশ্যই পুনরায় সেট করতে হবে, বা আপনি @ ব্যবহারকারী42826 দ্বারা উল্লিখিত সমস্যাগুলিতে চলে যাবেন 28

পারফরম্যান্স প্রভাব বিশাল। আমি একটি স্থানীয় ইনস্টলেশন 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
@ আইয়ানডান কেবলমাত্র রেকর্ডের জন্য: switch_to_blog()যাইহোক খুব সীমাবদ্ধ (ভাঙা) এপিআই। যদি ওয়ার্ডপ্রেস কখনও এটি ঠিক করে , আমাদের যাইহোক আমাদের কোড রিফ্যাক্টর করতে হবে। এবং ওয়ার্ডপ্রেস এর প্রিয় গ্লোবালগুলি কখনই ছাড়বে না।
ফুসিয়া

2
@ ইয়ানডুন I don't think modifying the globals directly is a good idea, কোর ডেভেলপারদের ডব্লিউপি করতে বলবেন না;)
এজাজ

1
@ জেডি অবশ্যই আপনার প্রসঙ্গে সচেতন হওয়া দরকার। ইতিমধ্যে স্যুইচড স্টেটের ক্ষেত্রে আপনার কাছে স্ট্যাকের সঠিক সূচি বজায় রাখতেও পারে। আমি সম্ভবত এটি এড়ানোর জন্য কোনও উপায় অনুসন্ধান করব। অন্যদিকে, এটি ওয়ার্ডপ্রেস, তাই অন্য কোনও উপায় নাও থাকতে পারে…
ফুসিয়া

1

@ টসচো উত্তরের জন্য ধন্যবাদ। এই অনুরোধটি ডাব্লুপি'র সারিতে রয়েছে - আপডেটগুলি এখানে দেখুন । ডাব্লুপি-তে স্থির হওয়া পর্যন্ত, যদি কেউ মরিয়া হয়ে স্ট্যান্ডার্ডটি ব্যবহার করতে চায় 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();
    }

}

এবং যখন আপনি আপনার একাধিক সুইচ শেষ করেন কেবল তখনই সম্পাদন করুন। (আরও: ডাব্লুপি-অন্তর্ভুক্ত / এমএস-ব্লগস.এফপি )

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.