Comment puis-je faire confiance à switch_to_blog ()?


18

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:

entrez la description de l'image ici

Maintenant, les événements suivants peuvent se produire:

  1. Elle enregistre le message avec succès et continue de traduire le message.
  2. Un autre utilisateur, un administrateur réseau, supprime le blog allemand pendant qu'elle écrit.
  3. 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.


Que diriez - vous $wpdb->blogid;et le crochet wp_insert_post_data?
JMau

@JMau 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.
fuxia

5
Une requête SQL mise en cache par demande pour blog_id dans la table wp_blogs (où supprimé = 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 Penser à haute voix ... Il y en a 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)?
kaiser

Réponses:


10

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.

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

Usage

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

pourquoi $wpdb->get_results+ wp_list_pluckau 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 ...
gmazzap

@GM 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.
fuxia

Ah ok ... Je ferais mieux de lire la requête maintenant, vous obtenez tous les identifiants de blog pour un identifiant de site spécifique, au début, je pense que vous n'obtenez qu'un seul identifiant de blog à la fois (celui qui est passé à la fonction) ... bien sûr, le tableau c'est mieux. Je suis désolé, il n'est pas possible de +1 à nouveau :)
gmazzap
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.