it-swarm.com.de

Wie kann ich switch_to_blog () vertrauen?

Wenn ich switch_to_blog() mit einer Blog-ID anrufe, weiß ich nicht, ob dieses Blog tatsächlich existiert. Die Funktion gibt immer TRUE zurück.

Testfall:

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

Dies führt zu Datenbankfehlern, die dem Benutzer angezeigt werden. Wie kann ich das verhindern?

Anwendungsfall der realen Welt

Ich war der Hauptentwickler von Multilingual Press . Wenn ein Benutzer einen Beitrag übersetzt, wird ein Bildschirm wie folgt angezeigt:

enter image description here

Nun kann folgendes passieren:

  1. Sie speichert den Beitrag erfolgreich und setzt die Übersetzung des Beitrags fort.
  2. Ein anderer Benutzer, ein Netzwerkadministrator, löscht den deutschen Blog, während er schreibt.
  3. Sie drückt erneut auf Speichern und bekommt Datenbankfehler.

Ich möchte dieses Szenario vermeiden. Wie kann ich schnell prüfen, ob das Zielblog existiert? Ich rufe switch_to_blog() sehr oft in mehreren verschiedenen Klassen an, also muss es schnell gehen.

18
fuxia

Die Idee von @ G.M., den Scheck zwischenzuspeichern, hat mich zu der folgenden Hilfsfunktion geführt. Ich habe es in den globalen Namespace eingefügt, damit es überall verfügbar ist.

Die Funktion sagt nichts über den Blog-Status aus, nur wenn er existiert und nicht als gelöscht markiert ist. Die Datenbankabfrage ist sehr schnell (0,0001 Sekunden) und führt nur eine Abfrage pro Site-ID aus, unabhängig davon, wie oft die Funktion aufgerufen wird.

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

Verwendungszweck

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