Switch_to_blog () 'a nasıl güvenebilirim?


18

Bir switch_to_blog()blog kimliğiyle aradığımda, o blogun gerçekten var olup olmadığını bilmiyorum. İşlev her zaman geri döner TRUE.

Test durumu:

switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();

Bu, kullanıcıya maruz kalan veritabanı hatalarına neden olur. Bunu nasıl önleyebilirim?

Gerçek dünya kullanım durumu

Multilingual Press'in baş geliştiricisiydim . Kullanıcı bir yayını çevirdiğinde şöyle bir ekran alır:

resim açıklamasını buraya girin

Şimdi aşağıdakiler olabilir:

  1. Yazıyı başarıyla kaydeder ve yazıyı çevirmeye devam eder.
  2. Başka bir kullanıcı, bir ağ yöneticisi, yazarken Alman blogunu siler.
  3. O tekrar kaydet vurur ve veritabanı hataları alır.

Bu senaryodan kaçınmak istiyorum. Hedef blogun mevcut olup olmadığını nasıl hızlı bir şekilde kontrol edebilirim ? switch_to_blog()Birden çok farklı sınıfta çok sık çağırıyorum , bu yüzden hızlı olmalı.


Peki ya $wpdb->blogid;kanca wp_insert_post_data?
JMau

@JMau get_post()sadece bir okuma. Son kaydetme ile bir sonraki düzenleme ekranı yeniden yüklemesi arasında uzun bir duraklama olabilir.
fuxia

5
Wp_blogs tablosunda blog_id için istek başına önbelleğe alınmış SQL sorgusu (burada silindi = 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 Yüksek sesle düşünmek ... Var wp_cache_switch_to_blog(), ama yalnızca kalıcı önbellek ile yardımcı olur, sayfadaki WP varsayılanı değil. Her neyse, benim için blogun varlığını nerede kontrol etmek istediğiniz açık değil: Birisi bir blogu sildiğinde ya da birisi farklı bir bloga işaret eden çevrilmiş yayını yazmaya çalıştığında (aynı içeriği başka bir dilde güçlendiriyor)?
kaiser

Yanıtlar:


10

@ GM'nin kontrolü önbellekleme fikri beni aşağıdaki yardımcı fonksiyona götürdü. Her yerde kullanılabilir olmasını sağlamak için küresel ad alanına koydum.

İşlev, yalnızca varsa ve silinmiş olarak işaretlenmemişse, blog durumu hakkında hiçbir şey söylemez. Veritabanı sorgusu çok hızlıdır (0.0001 saniye) ve işlevin ne sıklıkta çağrıldığına bakılmaksızın site kimliği başına yalnızca bir sorgu çalıştırır.

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 ] );
    }
}

kullanım

if ( ! blog_exists( $blog_id ) )
    return new WP_Error( '410', "The blog with the id $blog_id has vanished." );

neden sadece $wpdb->get_results+ wp_list_pluckyerine (int) $wpdb->get_var? Ancak +1, ve benzer bir şey çekirdek switch_to_blog olması gerektiğini düşünüyorum ...
gmazzap

@ GM get_var()sadece bir sonuç döndürür. get_col()Şimdi kullandım ve boş bir sonucun tekrar getirilmediğinden emin oldum.
fuxia

Ah tamam ... Şimdi sorguyu daha iyi okudum, belirli bir site kimliği için tüm blog kimliklerini alıyorsunuz, ilk başta okuduğumda sadece bir blog kimliği aldığını sanıyordum (işleve geçti) ... dizi yolu daha iyi. Üzgünüm tekrar +1 mümkün değil :)
gmazzap
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.