Después de cada instancia switch_to_blog()
, debe llamar restore_current_blog()
para restaurar el blog actual (en realidad, anterior).
Pero si está pasando por dos o más blogs y está llamando switch_to_blog()
a cada uno, ¿hay alguna razón para no usar uno adicional switch_to_blog()
al final del ciclo para cambiar al blog original en lugar de llamar restore_current_blog()
a cada pase?
P.ej
Por qué no:
$original_blog_id = get_current_blog_id();
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
}
switch_to_blog( $original_blog_id );
en lugar de:
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
restore_current_blog_id();
}
Respuestas:
Después de cada instancia en la
switch_to_blog()
que necesite llamar, de lorestore_current_blog()
contrario, WP pensará que está en modo "conmutado" y puede devolver datos incorrectos.Si ve el código fuente de ambas funciones, verá esas funciones de inserción / extracción de datos en una llamada global
$GLOBALS['_wp_switched_stack']
. Si no llamarestore_current_blog()
después de cadaswitch_to_blog()
,$GLOBALS['_wp_switched_stack']
no estará vacío. Si$GLOBALS['_wp_switched_stack']
no está vacío, WP cree que está en modo conmutado, incluso si ha vuelto a utilizar el blog originalswitch_to_blog()
. La función de modo conmutado esms_is_switched()
y afectawp_upload_dir()
. Siwp_upload_dir()
cree que está en modo conmutado, puede devolver datos incorrectos.wp_upload_dir()
crea URL para el sitio, por lo que es una función muy crítica.Este es el uso correcto:
fuente
wp_upload_dir()
emplea para generar URL, pero tomaré su palabra de que esto realmente resulta en un comportamiento defectuoso. En cualquier caso, la existencia dems_is_switched()
significa que mi enfoque alternativo da como resultado que la función no se comporte como se esperaba y podría romper los complementos y el núcleo. Graciasrestore_current_blog()
necesita una actualización, ya que dice que para varios conmutadores, uno solo necesita guardar el actual$blog_id
y luego usar múltiplesswitch_to_blog()
llamadas.Si desea ejecutar varios blogs, no es necesario restaurar el blog anterior cada vez. Lo único que crece es
$GLOBALS['_wp_switched_stack']
: una matriz con ID de blog, nada de qué preocuparse.Pero tenga en cuenta que
restore_current_blog()
ya no funcionará (!!!) Después del segundo cambio, porque utiliza el blog anterior, que no es el primer blog en ese momento. Así que guarde la primera ID de blog y llame ...... en lugar de
restore_current_blog()
cuando hayas terminado. Las variables globales deben restablecerse, o se encontrará con los problemas mencionados por @ user42826.El impacto en el rendimiento es enorme. He realizado algunas pruebas en una instalación local con 12 sitios:
Resultado:
El uso
restore_current_blog()
después de cada cambio duplica el tiempo que se necesita solo para cambiar.fuente
restore_current_blog()
no acaba de retrive el ID de llamada blog anterior yswitch_to_blog()
- un breve vistazo al código fuente y parece que hay un poco de duplicación de código ...switch_to_blog()
es una API muy limitada (rota) de todos modos. Si WordPress alguna vez corrige eso , tenemos que refactorizar nuestro código de todos modos. Y WordPress nunca renunciará a sus queridos globales.I don't think modifying the globals directly is a good idea
, no se lo digas a los desarrolladores principales de wp;)Gracias a @toscho respuesta. Esta solicitud en la cola de WP: consulte las actualizaciones aquí . Hasta que se solucione en WP, si alguien quiere desesperadamente usar el estándar
restore_current_blog()
, entonces aquí hay otro método (corríjalo si estoy equivocado):hacer su función, es decir
y ejecutar solo una vez cuando termine sus múltiples interruptores. (más: wp-includes / ms-blogs.php )
fuente