Lorsque j'appelle switch_to_blog()
avec un identifiant de blog, je ne sais pas si ce blog existe réellement. La fonction retourne toujours TRUE
.
Cas de test:
switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();
Cela entraînera des erreurs de base de données qui sont exposées à l'utilisateur. Comment puis-je empêcher cela?
Cas d'utilisation du monde réel
J'étais le développeur principal de Multilingual Press . Lorsqu'un utilisateur traduit un message, il obtient un écran comme celui-ci:
Maintenant, les événements suivants peuvent se produire:
- Elle enregistre le message avec succès et continue de traduire le message.
- Un autre utilisateur, un administrateur réseau, supprime le blog allemand pendant qu'elle écrit.
- Elle clique à nouveau sur Enregistrer et obtient des erreurs de base de données.
Je veux éviter ce scénario. Comment puis-je vérifier rapidement si le blog cible existe? J'appelle switch_to_blog()
très souvent dans plusieurs classes différentes, donc ça doit être rapide.
$wpdb->blogid;
et le crochetwp_insert_post_data
?get_post()
n'est qu'une lecture. Il peut y avoir une longue pause entre la dernière sauvegarde et le prochain rechargement de l'écran d'édition.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()
, mais cela n'aide qu'avec le cache persistant, pas la chose par défaut sur la page WP. Quoi qu'il en soit, pour moi, ce n'est pas vraiment clair où vous voulez vérifier l'existence du blog: quand quelqu'un supprime un blog ou quand quelqu'un essaie d'écrire le message traduit qui pointe vers un blog différent (alimenter le même contenu dans une autre langue)?Réponses:
L'idée de @ GM de mettre le chèque en cache m'a conduit à la fonction d'assistance suivante. Je l'ai mis dans l'espace de noms global pour qu'il soit disponible partout.
La fonction ne dit rien sur l'état du blog, juste s'il existe et n'est pas marqué comme supprimé. La requête de base de données est très rapide (0,0001 seconde) et exécute une seule requête par identifiant de site, quelle que soit la fréquence d'appel de la fonction.
Usage
la source
$wpdb->get_results
+wp_list_pluck
au lieu de seulement(int) $wpdb->get_var
? cependant +1, et je pense que quelque chose de similaire devrait être dans le noyau switch_to_blog ...get_var()
renvoie un seul résultat. J'ai utiliséget_col()
maintenant, et je me suis assuré qu'un résultat vide n'est pas récupéré à nouveau.