Como posso confiar em switch_to_blog ()?

17

Quando eu chamo switch_to_blog() com um ID de blog, não sei se esse blog realmente existe. A função retorna sempre TRUE .

Caso de teste:

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

Isso resultará em erros do banco de dados expostos ao usuário. Como posso evitar isso?

Caso de uso do mundo real

Eu era o principal desenvolvedor da Multilingual Press . Quando um usuário traduz uma postagem, ela recebe uma tela como esta:

Agora, o seguinte pode acontecer:

  1. Ela salva a postagem com sucesso e continua a traduzir a postagem.
  2. Outro usuário, um administrador de rede, exclui o blog alemão enquanto ela está escrevendo.
  3. Ela acessa novamente e recebe erros no banco de dados.

Eu quero evitar esse cenário. Como posso verificar rapidamente se o blog de destino existe? Eu chamo switch_to_blog() com muita frequência em várias classes diferentes, então tem que ser rápido.

    
por fuxia 18.03.2014 / 01:33
fonte

1 resposta

9

A ideia de @G.M de armazenar o cheque em cache levou-me à seguinte função auxiliar. Eu coloquei no namespace global para tê-lo disponível em todos os lugares.

A função não diz nada sobre o status do blog, apenas se ele existir e não estiver marcado como excluído. A consulta do banco de dados é muito rápida (0,0001 segundos) e executa apenas uma consulta por ID do site, independentemente da frequência com que a função é chamada.

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." );
    
por fuxia 18.03.2014 / 05:14
fonte