¿Cómo puedo confiar en switch_to_blog ()?

17

Cuando llamo a switch_to_blog() con una identificación de blog, no sé si ese blog existe realmente. La función devuelve siempre TRUE .

Caso de prueba:

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

Esto dará lugar a errores en la base de datos que están expuestos al usuario. ¿Cómo puedo prevenir eso?

Caso de uso del mundo real

Fui el desarrollador líder de Multilingual Press . Cuando un usuario traduce una publicación, obtiene una pantalla como esta:

Ahora puede suceder lo siguiente:

  1. Guarda la publicación correctamente y continúa traduciendo la publicación.
  2. Otro usuario, un administrador de red, elimina el blog alemán mientras está escribiendo.
  3. Ella vuelve a guardar y obtiene errores en la base de datos.

Quiero evitar ese escenario. ¿Cómo puedo verificar rápidamente si el blog de destino existe? Llamo a menudo a switch_to_blog() en varias clases diferentes, por lo que tiene que ser rápido.

    
pregunta fuxia 18.03.2014 - 01:33

1 respuesta

9
La idea de

@G.M. de almacenar en caché el cheque me ha llevado a la siguiente función auxiliar. Lo he puesto en el espacio de nombres global para tenerlo disponible en todas partes.

La función no dice nada sobre el estado del blog, solo si existe y no está marcada como eliminada. La consulta de la base de datos es muy rápida (0.0001 segundos) y se ejecuta solo una consulta por ID de sitio, sin importar la frecuencia con la que se llame la función.

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

Lea otras preguntas en las etiquetas