Wie kann ich switch_to_blog () vertrauen?


18

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

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 angezeigt, der wie folgt aussieht:

Bildbeschreibung hier eingeben

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 erhält Datenbankfehler.

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


Wie wäre es $wpdb->blogid;und der Haken wp_insert_post_data?
JMau

@JMau get_post()ist nur eine Lektüre. Zwischen dem letzten Speichern und dem erneuten Laden des Bearbeitungsbildschirms kann eine lange Pause liegen.
Fuxia

5
Eine auf Anfrage zwischengespeicherte SQL-Abfrage für blog_id in der Tabelle wp_blogs (wo gelöscht = 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 Lautes Nachdenken ... Gibt wp_cache_switch_to_blog()es, aber es hilft nur bei persistentem Cache, nicht bei der auf Seite WP voreingestellten Sache. Wie auch immer, für mich ist es nicht wirklich klar, wo Sie das Bestehen eines Blogs überprüfen möchten: Wenn jemand ein Blog löscht oder wenn jemand versucht, den übersetzten Beitrag zu schreiben, der auf ein anderes Blog verweist (denselben Inhalt in einer anderen Sprache bereitstellen)?
Kaiser

Antworten:


10

@GMs Idee, den Scheck zwischenzuspeichern, hat mich zu der folgenden Hilfsfunktion geführt. Ich habe es in den globalen Namespace gestellt, 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 ] );
    }
}

Verwendung

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

warum $wpdb->get_results+ wp_list_pluckstatt nur (int) $wpdb->get_var? jedoch +1, und ich denke, dass etwas ähnliches im Kern switch_to_blog sein sollte ...
gmazzap

@GM get_var()gibt nur ein Ergebnis zurück. Ich habe get_col()jetzt verwendet, und ich habe sichergestellt, dass ein leeres Ergebnis nicht erneut abgerufen wird.
fuxia

Ah ok ... ich lese jetzt besser die Abfrage, du bekommst alle Blog-IDs für eine bestimmte Site-ID, zuerst lese ich, dass du nur eine Blog-ID zur Zeit bekommst (die, die an function übergeben wurde) ... sicher das Array Weg ist besser. Es tut mir leid, ist nicht wieder möglich +1 :)
gmazzap
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.