¿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_idserá 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.
DeadArtcore
Revisa esto: restore_current_blog() vs switch_to_blog()
brasofilo
@brasofilo, muchas gracias por el enlace, esto cambia mi perspectiva sobre restore_current_blog() ;-)
birgire
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
DeadArtcore
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.
birgire
en tu versión pastie número 2, tu código debería estar dentro del bucle foreach donde marqué // ... etc
birgire
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.
birgire
gracias, te avisaré si funcionó. ¡Gracias por tu increíble ayuda! :D
DeadArtcore
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
DeadArtcore
Reemplaza foreach($rightbox as $post) con foreach($posts as $post) en tu pastie.
birgire
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
DeadArtcore
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. :)
Christine Cooper
gracias por compartir esa información @ChristineCooper. Parece que usé $original_blog_id aquí para evitar sobrescribir $blog_id ;-)
birgire
Espero que esté bien que agregué tu comentario a la respuesta actualizada @ChristineCooper
birgire
¡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!
Jornes
Mira mi respuesta aquí: https://wordpress.stackexchange.com/questions/307040/wp-rest-api-multisite-get-posts-from-all-sites/307051#307051
birgire
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é).