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:
Nun kann folgendes passieren:
- Sie speichert den Beitrag erfolgreich und setzt die Übersetzung des Beitrags fort.
- Ein anderer Benutzer, ein Netzwerkadministrator, löscht den deutschen Blog, während er schreibt.
- 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.
$wpdb->blogid;
und der Hakenwp_insert_post_data
?get_post()
ist nur eine Lektüre. Zwischen dem letzten Speichern und dem erneuten Laden des Bearbeitungsbildschirms kann eine lange Pause liegen.SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
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)?Antworten:
@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.
Verwendung
quelle
$wpdb->get_results
+wp_list_pluck
statt nur(int) $wpdb->get_var
? jedoch +1, und ich denke, dass etwas ähnliches im Kern switch_to_blog sein sollte ...get_var()
gibt nur ein Ergebnis zurück. Ich habeget_col()
jetzt verwendet, und ich habe sichergestellt, dass ein leeres Ergebnis nicht erneut abgerufen wird.