Setelah setiap contoh dari switch_to_blog()
Anda harus menelepon restore_current_blog()
untuk mengembalikan blog saat ini (sebenarnya, sebelumnya).
Tetapi jika Anda mengulang dua atau lebih blog dan memanggil switch_to_blog()
masing-masing, apakah ada alasan untuk tidak menggunakan tambahan switch_to_blog()
di akhir loop untuk beralih ke blog asli daripada menelepon restore_current_blog()
di setiap pass.
Misalnya
Kenapa tidak:
$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 );
dari pada:
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
restore_current_blog_id();
}
Jawaban:
Setelah setiap contoh
switch_to_blog()
Anda perlu meneleponrestore_current_blog()
sebaliknya WP akan berpikir itu dalam mode "switched" dan berpotensi dapat mengembalikan data yang salah.Jika Anda melihat kode sumber untuk kedua fungsi tersebut, Anda akan melihat fungsi-fungsi itu mendorong / memunculkan data menjadi global
$GLOBALS['_wp_switched_stack']
. Jika Anda tidak meneleponrestore_current_blog()
setelah setiapswitch_to_blog()
,$GLOBALS['_wp_switched_stack']
akan kosong. Jika$GLOBALS['_wp_switched_stack']
WP non-kosong berpikir itu dalam mode yang diaktifkan, bahkan jika Anda beralih kembali ke blog asli menggunakanswitch_to_blog()
. Fungsi mode yang diaktifkan adalahms_is_switched()
dan itu memengaruhiwp_upload_dir()
. Jikawp_upload_dir()
dianggap berada dalam mode switched, itu dapat mengembalikan data yang salah.wp_upload_dir()
membangun URL untuk situs, jadi itu adalah fungsi yang sangat kritis.Ini adalah penggunaan yang benar:
sumber
wp_upload_dir()
mempekerjakan untuk menghasilkan url, tapi saya akan mengambil kata-kata Anda bahwa ini memang mengakibatkan perilaku buggy. Bagaimanapun, keberadaanms_is_switched()
berarti pendekatan alternatif saya menghasilkan fungsi tidak berperilaku seperti yang diharapkan dan dapat merusak plug-in serta inti. Terima kasihrestore_current_blog()
memerlukan pembaruan, karena dikatakan bahwa untuk beberapa switch, satu hanya perlu menyimpan saat ini$blog_id
dan kemudian menggunakan beberapaswitch_to_blog()
panggilan.Jika Anda ingin menjalankan beberapa blog, Anda tidak perlu mengembalikan blog sebelumnya setiap kali. Satu-satunya hal yang tumbuh adalah
$GLOBALS['_wp_switched_stack']
- array dengan ID blog, tidak perlu khawatir.Tapi perlu diingat,
restore_current_blog()
tidak akan berfungsi (!!!) Lagi setelah beralih kedua, karena menggunakan blog sebelumnya - yang bukan blog pertama saat itu. Jadi simpan ID blog pertama, dan hubungi ...... bukannya
restore_current_blog()
saat Anda selesai. Variabel global harus disetel ulang, atau Anda akan mengalami masalah yang disebutkan oleh @ user42826.Dampak kinerja sangat besar. Saya telah menjalankan beberapa tes pada instalasi lokal dengan 12 situs:
Hasil:
Menggunakan
restore_current_blog()
setelah setiap saklar menggandakan waktu yang dibutuhkan hanya untuk beralih.sumber
restore_current_blog()
tidak hanya membuka kembali ID dan panggilan blog sebelumnyaswitch_to_blog()
- melihat sekilas sumber kode dan sepertinya ada sedikit duplikasi kode ...switch_to_blog()
API yang sangat terbatas (rusak). Jika WordPress pernah perbaikan yang , kita harus refactor kode kita pula. Dan WordPress tidak akan pernah menyerah global tercinta.I don't think modifying the globals directly is a good idea
, jangan katakan itu kepada pengembang inti wp;)Terima kasih atas jawaban @toscho. Permintaan ini dalam antrian WP - lihat pembaruan di sini . Sampai yang diperbaiki di WP, jika ada yang sangat ingin menggunakan standar
restore_current_blog()
, maka di sini adalah metode lain (tolong perbaiki jika saya salah):membuat fungsi Anda, yaitu
dan jalankan hanya sekali ketika Anda menyelesaikan beberapa switch Anda. (selengkapnya: wp-include / ms-blogs.php )
sumber