¿Cómo obtener entradas de sitios en Multisite?
Estoy tratando de extraer entradas de múltiples sitios. Por ejemplo, puedo extraer las entradas de un solo sitio por categoría y un total de 10 entradas.
Pero estoy intentando extraer entradas de dos blogs separados de Multisite 1 y 2. Pero solo funciona el blog 1. Además, quiero extraer otra categoría del blog 1 y blog 2 por otra categoría. ¿Cómo puedo lograr esto?
Esto es lo que estoy tratando de hacer:
<?php
global $switched;
switch_to_blog(1,2); //cambiado a 1 y 2 pero solo funciona el 1
// Obtener últimas Entradas
$latest_posts = get_posts('&cat=64&showposts=10');
$cnt =0;?>
<ul>
<?php foreach($latest_posts as $post) : setup_postdata($post);?>
<li>
<a href="<?php echo get_page_link($post->ID); ?>" title="<?php echo $post->post_title; ?>"><?php echo short_title('...', 7); ?></a>
</li>
<?php endforeach ; ?>
<?php restore_current_blog(); //volver al sitio principal ?>

La función de WordPress switch_to_blog()
espera un entero como parámetro de entrada. Puedes leer más sobre esto en el Codex:
http://codex.wordpress.org/Function_Reference/switch_to_blog
Por favor, prueba este tipo de estructura en su lugar:
// Obtener el ID del blog actual
$original_blog_id = get_current_blog_id();
// Todos los blog_id's para iterar
$bids = array( 1, 2 );
foreach( $bids as $bid )
{
// Cambiar al blog con el blog_id $bid
switch_to_blog( $bid );
// ... tu código para cada blog ...
}
// Volver al blog actual
switch_to_blog( $original_blog_id );
Actualización:
Si deseas obtener publicaciones de diferentes categorías para cada blog, puedes usar por ejemplo:
// Obtener el blog actual
$original_blog_id = get_current_blog_id();
// Configurar un slug de categoría para cada blog id que quieras iterar - EDITAR
$catslug_per_blog_id = array(
1 => 'video',
4 => 'noticias'
);
foreach( $catslug_per_blog_id as $bid => $catslug )
{
// Cambiar al blog con el blog id $bid
switch_to_blog( $bid );
// ... tu código para cada blog ...
$myposts = get_posts(
array(
'category_name' => $catslug,
'posts_per_page' => 10,
)
);
// ... etc
}
// Volver al blog actual
switch_to_blog( $original_blog_id );
Ejemplo:
Aquí hay un ejemplo que te permite usar etiquetas de plantilla (esto funciona en mi instalación multisitio):
// Obtener el blog actual
$original_blog_id = get_current_blog_id();
// Configurar una categoría para cada blog id que quieras iterar - EDITAR
$catslug_per_blog_id = array(
1 => 'video',
4 => 'noticias'
);
foreach( $catslug_per_blog_id as $bid => $catslug )
{
// Cambiar al blog con el blog id $bid
switch_to_blog( $bid );
// Obtener publicaciones para cada blog
$myposts = get_posts(
array(
'category_name' => $catslug,
'posts_per_page' => 2,
)
);
// Saltar un blog si no se encuentran publicaciones
if( empty( $myposts ) )
continue;
// Bucle para cada blog
$li = '';
global $post;
foreach( $myposts as $post )
{
setup_postdata( $post );
$li .= the_title(
$before = sprintf( '<li><a href="%s">', esc_url( get_permalink() ) ),
$after = '</a></li>',
$echo = false
);
}
// Imprimir para cada blog
printf(
'<h2>%s (%s)</h2><ul>%s</ul>',
esc_html( get_bloginfo( 'name' ) ),
esc_html( $catslug ),
$li
);
}
// Volver al blog actual
switch_to_blog( $original_blog_id );
wp_reset_postdata();
Aquí hay una captura de pantalla de demostración para nuestro ejemplo anterior con el sitio 1 llamado Beethoven y el sitio 4 llamado Bach:
PD: Gracias a @brasofilo por proporcionar el enlace que aclara mi malentendido sobre restore_current_blog()
;-)
PPS: Gracias a @ChristineCooper por compartir el siguiente comentario:
Solo una advertencia amistosa. Asegúrate de no asignar tu ID de blog original a la variable
$blog_id
-- esto se debe a que durante el proceso deswitch_to_blog()
,$blog_id
será sobrescrito por la función principal, lo que significa que cuando intentes volver al blog original, terminarás cambiando al último que iteraste. Un pequeño rompecabezas mental. :)

aquí está cómo cargo mis publicaciones http://pastie.org/7827649 ¿cómo puedo implementar eso en esto también como mencioné, por ambos IDs de blog pero cada ID de blog con categoría específica? El blog 1 tendrá la categoría videos y el blog 2 tendrá la categoría noticias, también obtener un total de 10 publicaciones como límite.

Revisa esto: restore_current_blog() vs switch_to_blog()

@brasofilo, muchas gracias por el enlace, esto cambia mi perspectiva sobre restore_current_blog()
;-)

todavía estoy encontrando un problema, solo muestra una publicación en el blog multisitio original, eso es todo, así es como lo hice http://pastie.org/7831263

Prueba el ejemplo simple que agregué a la respuesta, y asegúrate de que tus blogs y categorías sean correctos. Si eso funciona, entonces deberías poder expandirlo según tus necesidades.

en tu versión pastie número 2, tu código debería estar dentro del bucle foreach donde marqué // ... etc

pd: actualicé el ejemplo nuevamente, para que puedas usar etiquetas de plantilla como the_title()
en lugar de $post->post_title
;-) Espero haberte dado suficiente información para que puedas terminar tu proyecto.

gracias, te avisaré si funcionó. ¡Gracias por tu increíble ayuda! :D

mira, el problema es que todo se muestra suave pero muestra todo en lista, ya sabes como lo publiqué en mi pastie, así es como lo quiero porque simplemente poner título y todo eso es un poco complicado para mí, no tengo mucho conocimiento, ¿hay alguna manera de lograrlo de la forma simple que lo tenía? ¿hay alguna manera de mantenerlo así? http://pastie.org/7896095 disculpa por ser una molestia espero que entiendas

Reemplaza foreach($rightbox as $post)
con foreach($posts as $post)
en tu pastie.

Recibo un error Parse error: syntax error, unexpected $end en el index.php así que simplemente agregué ese código en el index.php por sí solo y obtengo ese error, aquí está la versión actualizada http://pastie.org/7896699

Solo una advertencia amistosa. Asegúrate de no asignar tu ID de blog original a la variable $blog_id -- esto se debe a que durante el proceso switch_to_blog(), $blog_id será sobrescrito por la función principal, lo que significa que cuando intentes volver al blog original, terminarás cambiando al último que recorriste. Un pequeño rompecabezas mental. :)

gracias por compartir esa información @ChristineCooper. Parece que usé $original_blog_id
aquí para evitar sobrescribir $blog_id
;-)

Espero que esté bien que agregué tu comentario a la respuesta actualizada @ChristineCooper

¡Hola! Me gustaría preguntar, ¿cómo lo implemento para que funcione? ¿Pongo este código en mi tema o lo agrego al functions.php? ¡Gracias!

Mira mi respuesta aquí: https://wordpress.stackexchange.com/questions/307040/wp-rest-api-multisite-get-posts-from-all-sites/307051#307051

Echa un vistazo al código en mi plugin "Multisite Post Reader" https://wordpress.org/plugins/multisite-post-reader/. Utiliza la técnica mencionada en la otra respuesta para recorrer las publicaciones. También tengo plugins que hacen lo mismo para imágenes.
Como es código de código abierto, eres bienvenido a explorar el código y utilizar partes de él para tu propio uso. (Parte del código está modificado de código de código abierto que encontré).
