Come posso fidarmi di switch_to_blog ()?


18

Quando chiamo switch_to_blog()con un ID blog, non so se quel blog esiste davvero. La funzione ritorna sempre TRUE.

Caso di prova:

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

Ciò comporterà errori del database che sono esposti all'utente. Come posso impedirlo?

Caso d'uso del mondo reale

Sono stato lo sviluppatore principale di Multilingual Press . Quando un utente traduce un post, ottiene una schermata come questa:

inserisci qui la descrizione dell'immagine

Ora può succedere quanto segue:

  1. Salva il post con successo e continua a tradurre il post.
  2. Un altro utente, un amministratore di rete, elimina il blog tedesco mentre sta scrivendo.
  3. Colpisce di nuovo il salvataggio e ottiene errori del database.

Voglio evitare quello scenario. Come posso verificare rapidamente se esiste il blog di destinazione? Chiamo switch_to_blog()molto spesso in più classi diverse, quindi deve essere veloce.


Che ne dici di $wpdb->blogid;e il gancio wp_insert_post_data?
JMau,

@JMau get_post()è solo una lettura. Potrebbe esserci una lunga pausa tra l'ultimo salvataggio e la successiva ricarica della schermata di modifica.
fuxia

5
Una query SQL memorizzata nella cache per richiesta per blog_id nella tabella wp_blogs (dove cancellata = 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 Pensare ad alta voce ... C'è wp_cache_switch_to_blog(), ma aiuta solo con cache persistente, non l'impostazione predefinita di WP sulla pagina. Ad ogni modo, per me non è davvero chiaro dove si desidera controllare l'esistenza del blog: quando qualcuno elimina un blog o quando qualcuno cerca di scrivere il post tradotto che punta a un blog diverso (alimentando lo stesso contenuto in un'altra lingua)?
Kaiser

Risposte:


10

L'idea di @ GM di memorizzare nella cache il controllo mi ha portato alla seguente funzione di supporto. L'ho inserito nello spazio dei nomi globale per averlo disponibile ovunque.

La funzione non dice nulla sullo stato del blog, solo se esiste e non è contrassegnata come eliminata. La query del database è molto veloce (0,0001 secondi) ed esegue solo una query per ID sito, indipendentemente dalla frequenza con cui viene chiamata la funzione.

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

uso

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

perché $wpdb->get_results+ wp_list_pluckinvece di solo (int) $wpdb->get_var? comunque +1, e penso che qualcosa di simile dovrebbe essere nel core switch_to_blog ...
gmazzap

@GM get_var()restituisce solo un risultato. Ho usato get_col()ora e mi sono assicurato che un risultato vuoto non venisse più recuperato.
fuxia

Ah ok ... Ora è meglio che legga la query, ottieni tutti gli ID blog per un ID sito specifico, a prima lettura ho pensato che hai un solo ID blog alla volta (quello passato a funzionare) ... certo l'array la strada è migliore. Mi dispiace non è possibile +1 di nuovo :)
gmazzap
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.