Ketika saya menelepon switch_to_blog()
dengan id blog, saya tidak tahu apakah blog itu benar-benar ada. Fungsi selalu kembali TRUE
.
Kasus cobaan:
switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();
Ini akan menghasilkan kesalahan basis data yang diekspos kepada pengguna. Bagaimana saya bisa mencegahnya?
Kasus penggunaan dunia nyata
Saya adalah pengembang utama Multilingual Press . Ketika seorang pengguna menerjemahkan sebuah posting, ia mendapat layar seperti ini:
Sekarang yang berikut ini bisa terjadi:
- Dia berhasil menyimpan posting dan terus menerjemahkan posting.
- Pengguna lain, admin jaringan, menghapus blog Jerman saat dia menulis.
- Dia menekan save lagi dan mendapat kesalahan basis data.
Saya ingin menghindari skenario itu. Bagaimana saya bisa mengecek dengan cepat jika blog target ada? Saya switch_to_blog()
sering menelepon di beberapa kelas yang berbeda, jadi harus cepat.
$wpdb->blogid;
dengan kaitnyawp_insert_post_data
?get_post()
hanya membaca. Mungkin ada jeda panjang antara penyimpanan terakhir dan pemuatan layar edit berikutnya.SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
wp_cache_switch_to_blog()
, tapi itu hanya membantu dengan cache persisten, bukan default pada hal WP halaman. Ngomong-ngomong, bagi saya itu tidak benar-benar jelas di mana Anda ingin memeriksa keberadaan blog: Ketika seseorang menghapus sebuah blog atau ketika seseorang mencoba untuk menulis posting yang diterjemahkan yang menunjuk ke blog yang berbeda (menyalakan konten yang sama dalam bahasa lain)?Jawaban:
@ Gagasan GM untuk menyembunyikan cek telah mengarahkan saya ke fungsi pembantu berikut. Saya telah memasukkannya ke ruang nama global agar tersedia di mana-mana.
Fungsi tidak mengatakan apa pun tentang status blog, hanya jika ada dan tidak ditandai sebagai dihapus. Permintaan basis data sangat cepat (0,0001 detik) dan hanya menjalankan satu permintaan per situs id, tidak peduli seberapa sering fungsi dipanggil.
Pemakaian
sumber
$wpdb->get_results
+wp_list_pluck
bukan hanya(int) $wpdb->get_var
? Namun +1, dan saya pikir sesuatu yang serupa harus di coreget_var()
mengembalikan hanya satu hasil. Saya telah menggunakanget_col()
sekarang, dan saya memastikan hasil kosong tidak diambil lagi.