Wie kann ich switch_to_blog () vertrauen?

Wenn ich switch_to_blog() mit einer Blog-ID switch_to_blog() , weiß ich nicht, ob das Blog tatsächlich existiert. Die function gibt immer TRUE .

Testfall:

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

Dies führt zu databaseerrorsn, die dem Benutzer ausgesetzt sind. Wie kann ich das verhindern?

Echte Welt Anwendungsfall

Ich war der leitende Entwickler von Multilingual Press . Wenn ein Benutzer einen Beitrag übersetzt, erhält er einen Bildschirm wie diesen:

Bildbeschreibung hier eingeben

Jetzt kann folgendes passieren:

  1. Sie rettet die Post erfolgreich und setzt die Post fort.
  2. Ein anderer Benutzer, ein Netzwerkadministrator, löscht während des Schreibens den deutschen Blog.
  3. Sie trifft erneut auf Speichern und es kommt zu databaseerrorsn.

Ich möchte dieses Szenario vermeiden. Wie kann ich schnell überprüfen , ob das Ziel-Blog existiert? Ich rufe switch_to_blog() sehr oft in mehreren verschiedenen classn auf, also muss es schnell gehen.

Solutions Collecting From Web of "Wie kann ich switch_to_blog () vertrauen?"

@MS Idee, den Check zwischenzuspeichern, hat mich zu folgender Hilfsfunktion geführt. Ich habe es in den globalen Namespace eingefügt, um es überall verfügbar zu haben.

Die function sagt nichts über den Status des Blogs aus, wenn er existiert und nicht als gelöscht markiert ist. Die databaseabfrage ist sehr schnell (0,0001 Sekunden) und führt nur eine Abfrage pro Site-ID aus, egal wie oft die function 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." );