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:
Ahora puede suceder lo siguiente:
- Ella guarda la publicación con éxito y continúa traduciendo la publicación.
- Otro usuario, un administrador de red, elimina el blog alemán mientras escribe.
- 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.
$wpdb->blogid;
y el ganchowp_insert_post_data
?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.SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
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)?Respuestas:
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.
Uso
fuente
$wpdb->get_results
+ enwp_list_pluck
lugar de solo(int) $wpdb->get_var
? sin embargo +1, y creo que algo similar debería estar en core switch_to_blog ...get_var()
devuelve solo un resultado. Lo he usadoget_col()
ahora y me aseguré de que no se recupere un resultado vacío.