¿Cómo puedo confiar en switch_to_blog ()?

18

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

Caso de prueba:

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

Esto provocará errores en la base de datos que están expuestos al usuario. ¿Cómo puedo evitar eso?

Caso de uso del mundo real

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

ingrese la descripción de la imagen aquí

Ahora puede suceder lo siguiente:

  1. Ella guarda la publicación con éxito y continúa traduciendo la publicación.
  2. Otro usuario, un administrador de red, elimina el blog alemán mientras escribe.
  3. Presiona guardar nuevamente y obtiene errores de la base de datos.

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

fuxia
fuente
¿Qué tal $wpdb->blogid;y el gancho wp_insert_post_data?
JMau
@JMau get_post()es solo una lectura. Puede haber una pausa larga entre el último guardado y la próxima recarga de la pantalla de edición.
fuxia
55
¿Una consulta SQL en caché por solicitud para blog_id en la tabla wp_blogs (donde eliminado = 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 Pensando en voz alta ... Hay wp_cache_switch_to_blog(), pero solo ayuda con el caché persistente, no el valor predeterminado en la página WP. De todos modos, para mí no está realmente claro dónde desea verificar la existencia del blog: ¿Cuándo alguien elimina un blog o cuando alguien intenta escribir la publicación traducida que apunta a un blog diferente (activando el mismo contenido en otro idioma)?
Kaiser

Respuestas:

10

La idea de @ GM de guardar el cheque en caché me ha llevado a la siguiente función auxiliar. Lo puse 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á marcado como eliminado. La consulta de la base de datos es muy rápida (0,0001 segundos) y ejecuta solo una consulta por ID de sitio, sin importar con qué frecuencia se llame a 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." );
fuxia
fuente
¿por qué $wpdb->get_results+ en wp_list_plucklugar de solo (int) $wpdb->get_var? sin embargo +1, y creo que algo similar debería estar en core switch_to_blog ...
gmazzap
@GM get_var()devuelve solo un resultado. Lo he usado get_col()ahora y me aseguré de que no se recupere un resultado vacío.
fuxia
Ah ok ... Mejor leí la consulta ahora, obtienes todos los identificadores de blog para una identificación de sitio específica, al principio leí que solo obtienes una identificación de blog a la vez (la que pasó a funcionar) ... seguro que la matriz El camino es mejor. Lo siento, no es posible hacer +1 de nuevo :)
gmazzap