Cerrar
Image Alt

switch to blog en WordPress

Una de las cosas que más me han gustado de los cambios que incorpora WordPress 3.5 es que han mejorado la función para multisite switch_to_blog(). Según indican «es ahora significativamente más rápida y fiable».

¿Para qué sirve switch_to_blog()?

Como ya sabéis los que hayáis utilizado WordPress multisite la función switch_to_blog() nos permite ir a otro sitio dentro del multisite que hayamos creado con WordPress, obtener los datos que necesitemos y volver a nuestro sitio actual.

Por ejemplo, imaginad que tenemos un sitio principal (por ejemplo una revista de moda) y una serie de blogs (cada uno es un sitio independiente dentro del multisite) y queremos mostrar en la portada de la revista de moda el último artículo de cada blog. ¿Qué haríamos? Como cada sitio dentro del multisitio está representado por un ID, con la función switch_to_blog() iríamos blog a blog (podríamos obtener un array de los blogs más actualizados con la función get_last_updated() y crear un foreach con los blogs), haríamos un query para sacar el último post y volveríamos al sitio actual con la función restore_current_blog().

Genial, muy sencillo ¿no os parece?: Lo malo es que utilizando de esta manera switch to blog (al menos antes de WordPress 3.5, podíamos echar abajo una web que tuviera un tráfico considerable y un volúmen de datos importante.

La razón es que la función no estaba nada optimizada, era lenta y muy peligrosa de usar.

¿Cómo usar correctamente switch_to_blog()?

Yo aún no he hecho pruebas con switch_to_blog() desde la salida de WordPress 3.5, pero independientemente de que ahora sea más fiable y rápida es fundamental que cacheemos los datos obtenidos y sólo usemos switch_to_blog() cuando sea estrictamente necesario.

¿Cómo lo haríamos?

Para cachear los datos en WordPress tenemos a nuestra disposición Transients API y WP Object Cache.

Lo que haríamos sería el siguiente proceso (siguiendo con el ejemplo anterior):

  • Comprobamos si está en caché el último artículo del Blog con ID = 1
  • Si está en caché obtenemos de ahí los datos.
  • Si no está en caché, hacemos switch_to_blog(1) y obtenemos los datos. A continuación guardamos los datos en caché.

Como podéis ver en los enlaces anteriores a sendos artículos de este blog, Transients guarda los datos en la base de datos (podéis ver en el artículo cuando no ocurre esto). Por ello utilizad Transients siempre que no tengáis un sistema de caché de datos instalado.

Si utilizáramos WP Object Cache:

Otro ejemplo, un menú global para todo el multisite

A la hora de crear un multisite con WordPress, cada sitio es independiente de los demás. Pero en muchas ocasiones queremos que compartan un mismo menú global. ¿Cómo podemos hacerlo? Una forma de conseguirlo es con switch_to_blog(). Nos iríamos al sitio principal, leemos el menú que hay allí y volvemos.

Sería algo así:

Pero claro, esto tal y como decíamos, es muy peligroso e ineficiente. De nuevo puede acudir Transients API en nuestra ayuda:

Vemos como ahora hemos usado una función del Transients API especial para Multisite, get_site_transient() que funciona para toda la red de sitios del multisite y almacena los datos en la tabla wp_sitemeta.

En el sitio principal tendríamos que crear el menú y guardarlo para su uso en el resto de sitios de la red. Podemos crear esta función en el archivo functions.php del sitio principal (el que tiene el ID 1):

Y dentro de la plantilla que muestre el menú, normalmente header.php, haríamos en el sitio principal:

Este sistema tiene también inconvenientes, como hemos ido a lo sencillo se graba en la base de datos teniendo en cuenta la situación del usuario en el momento de grabarlo, con lo que no será fiable la posición de las clases «current-page-menu» etc.., pero es un mal menor.

Para el uso de caché en WordPress os recomiendo esta presentación de Otto Wood y Andrew Nacin. Me gusta cuando Andrew Nacin pregunta «¿Cuanta gente usa switch_to_blog()?¿Y cuanta gente ha echado abajo una web usando switch_to_blog()?» y Otto Wood dice «Más o menos el mismo número de gente…» Esperemos que con WordPress 3.5 esto haya cambiado.

Comentarios

  • Excelente artículo que puede ser muy útil para los que nos iniciamos en WordPress 3.5

    3 enero, 2013
    contestar
  • Bethsabé

    Me ha gustado mucho este post ya que he comenzado mi ESTRATEGIA DIGITAL y siempre he confiado en el sitio WordPress, el cual he estado usando ya hace algún tiempo. Esto me ayuda para conocer aún más lo que se puede hacer.

    10 julio, 2015
    contestar

Escribe un comentario