Bagaimana saya bisa mempercayai switch_to_blog ()?

18

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:

masukkan deskripsi gambar di sini

Sekarang yang berikut ini bisa terjadi:

  1. Dia berhasil menyimpan posting dan terus menerjemahkan posting.
  2. Pengguna lain, admin jaringan, menghapus blog Jerman saat dia menulis.
  3. 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.

fuxia
sumber
Bagaimana $wpdb->blogid;dengan kaitnya wp_insert_post_data?
JMau
@JMau get_post()hanya membaca. Mungkin ada jeda panjang antara penyimpanan terakhir dan pemuatan layar edit berikutnya.
fuxia
5
Permintaan SQL yang di-cache per-permintaan untuk blog_id di tabel wp_blogs (di mana dihapus = 0)?
gmazzap
1
@GMSELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
kaiser
@toscho Berpikir keras ... Ada 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)?
kaiser

Jawaban:

10

@ 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.

if ( ! function_exists( 'blog_exists' ) ) {

    /**
     * Checks if a blog exists and is not marked as deleted.
     *
     * @link   http://wordpress.stackexchange.com/q/138300/73
     * @param  int $blog_id
     * @param  int $site_id
     * @return bool
     */
    function blog_exists( $blog_id, $site_id = 0 ) {

        global $wpdb;
        static $cache = array ();

        $site_id = (int) $site_id;

        if ( 0 === $site_id )
            $site_id = get_current_site()->id;

        if ( empty ( $cache ) or empty ( $cache[ $site_id ] ) ) {

            if ( wp_is_large_network() ) // we do not test large sites.
                return TRUE;

            $query = "SELECT `blog_id` FROM $wpdb->blogs
                    WHERE site_id = $site_id AND deleted = 0";

            $result = $wpdb->get_col( $query );

            // Make sure the array is always filled with something.
            if ( empty ( $result ) )
                $cache[ $site_id ] = array ( 'do not check again' );
            else
                $cache[ $site_id ] = $result;
        }

        return in_array( $blog_id, $cache[ $site_id ] );
    }
}

Pemakaian

if ( ! blog_exists( $blog_id ) )
    return new WP_Error( '410', "The blog with the id $blog_id has vanished." );
fuxia
sumber
mengapa $wpdb->get_results+ wp_list_pluckbukan hanya (int) $wpdb->get_var? Namun +1, dan saya pikir sesuatu yang serupa harus di core
switch_to_blog
@ GM get_var()mengembalikan hanya satu hasil. Saya telah menggunakan get_col()sekarang, dan saya memastikan hasil kosong tidak diambil lagi.
fuxia
Ah ok ... Saya lebih baik membaca kueri sekarang, Anda mendapatkan semua id blog untuk id situs tertentu, pada awalnya baca saya pikir Anda hanya mendapatkan satu id blog pada waktu (yang berlalu berfungsi) ... yakin array cara lebih baik. Maaf tidak mungkin +1 lagi :)
gmazzap