Ottenere articoli da siti in Multisite?
Sto cercando di recuperare articoli da più siti. Per esempio, posso estrarre gli articoli di un singolo sito per categoria e con un totale di 10 articoli.
Ma sto cercando di estrarre gli articoli da due blog separati Multisite 1 e 2. Però funziona solo il blog 1. Inoltre, voglio estrarre un'altra categoria dal blog 1 e dal blog 2 con una categoria diversa. Come posso realizzarlo?
Ecco cosa sto cercando di fare:
<?php
global $switched;
switch_to_blog(1,2); // cambio al blog 1 e 2 ma funziona solo 1
// Ottieni gli ultimi Articoli
$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(); // ritorna al sito principale ?>

La funzione WordPress switch_to_blog()
si aspetta un intero come parametro di input. Puoi leggere di più nel Codex:
http://codex.wordpress.org/Function_Reference/switch_to_blog
Prova invece questa struttura:
// Ottieni l'ID del blog corrente
$original_blog_id = get_current_blog_id();
// Tutti gli ID dei blog da ciclare
$bids = array( 1, 2 );
foreach( $bids as $bid )
{
// Passa al blog con l'ID $bid
switch_to_blog( $bid );
// ... il tuo codice per ogni blog ...
}
// Ritorna al blog corrente
switch_to_blog( $original_blog_id );
Aggiornamento:
Se vuoi recuperare post da diverse categorie per ogni blog, puoi usare ad esempio:
// Ottieni il blog corrente
$original_blog_id = get_current_blog_id();
// Imposta uno slug di categoria per ogni ID blog che vuoi ciclare - MODIFICA
$catslug_per_blog_id = array(
1 => 'video',
4 => 'notizie'
);
foreach( $catslug_per_blog_id as $bid => $catslug )
{
// Passa al blog con l'ID $bid
switch_to_blog( $bid );
// ... il tuo codice per ogni blog ...
$myposts = get_posts(
array(
'category_name' => $catslug,
'posts_per_page' => 10,
)
);
// ... ecc.
}
// Ritorna al blog corrente
switch_to_blog( $original_blog_id );
Esempio:
Ecco un esempio che ti permette di usare i template tag (funziona nella mia installazione multisite):
// Ottieni il blog corrente
$original_blog_id = get_current_blog_id();
// Imposta una categoria per ogni ID blog che vuoi ciclare - MODIFICA
$catslug_per_blog_id = array(
1 => 'video',
4 => 'notizie'
);
foreach( $catslug_per_blog_id as $bid => $catslug )
{
// Passa al blog con l'ID $bid
switch_to_blog( $bid );
// Ottieni i post per ogni blog
$myposts = get_posts(
array(
'category_name' => $catslug,
'posts_per_page' => 2,
)
);
// Salta un blog se non ci sono post
if( empty( $myposts ) )
continue;
// Ciclo per ogni 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
);
}
// Stampa per ogni blog
printf(
'<h2>%s (%s)</h2><ul>%s</ul>',
esc_html( get_bloginfo( 'name' ) ),
esc_html( $catslug ),
$li
);
}
// Ritorna al blog corrente
switch_to_blog( $original_blog_id );
wp_reset_postdata();
Ecco uno screenshot dimostrativo del nostro esempio con il sito 1 chiamato Beethoven e il sito 4 chiamato Bach:
PS: Grazie a @brasofilo per aver fornito il link che chiarisce il mio fraintendimento su restore_current_blog()
;-)
PPS: Grazie a @ChristineCooper per aver condiviso il seguente commento:
Un amichevole avvertimento. Assicurati di non impostare l'ID del blog originale nella variabile
$blog_id
-- questo perché durante il processo diswitch_to_blog()
,$blog_id
verrà sovrascritto dalla funzione core, il che significa che quando tenti di tornare al blog originale, finirai per passare all'ultimo che hai ciclato. Un vero rompicapo. :)

ecco come carico i miei post http://pastie.org/7827649 come posso implementarlo anche qui come ho menzionato per entrambi gli ID del blog ma ogni ID del blog per categoria specifica il blog 1 avrà la categoria video & il blog 2 avrà la categoria notizie inoltre ottieni un totale di post limitato a 10.

Controlla questo: restore_current_blog() vs switch_to_blog()

@brasofilo, molte grazie per il link, questo cambia la mia visione su restore_current_blog()
;-)

Sto ancora riscontrando un problema, mostra solo un post sul blog multisito originale, ecco come ho fatto http://pastie.org/7831263

Prova l'esempio semplice che ho aggiunto alla risposta e assicurati che i tuoi blog e categorie siano corretti. Se funziona, allora dovresti essere in grado di espanderlo alle tue esigenze.

nella tua versione pastie nr 2, il tuo codice dovrebbe essere all'interno del ciclo foreach dove ho segnato // ... etc

ps: ho aggiornato di nuovo l'esempio, così puoi usare tag template come the_title()
invece di $post->post_title
;-) Spero di averti dato abbastanza informazioni per completare il tuo progetto.

grazie, ti farò sapere se ha funzionato, grazie per il tuo fantastico aiuto :D

guarda, il problema è che tutto viene visualizzato senza problemi ma viene mostrato tutto in elenco, sai come l'ho postato nel mio pastie, è così che voglio che sia perché inserire solo il titolo e tutto il resto è un po' complicato per me, non sono molto esperto. C'è un modo per ottenere proprio il modo semplice che avevo? C'è un modo per mantenerlo così? http://pastie.org/7896095 scusa per il disturbo, spero tu capisca

Sostituisci foreach($rightbox as $post)
con foreach($posts as $post)
nel tuo pastie.

Ricevo un errore di analisi: errore di sintassi, $end inaspettato nell'index.php, quindi ho semplicemente aggiunto quel codice nell'index.php da solo e ottengo quell'errore. Ecco la versione aggiornata http://pastie.org/7896699

Giusto un amichevole avvertimento. Assicurati di non impostare il tuo ID blog originale alla variabile $blog_id -- questo perché durante il processo di switch_to_blog(), $blog_id verrà sovrascritto dalla funzione core, il che significa che quando cercherai di tornare al blog originale, finirai per passare all'ultimo che hai iterato. Un piccolo rompicapo. :)

grazie per aver condiviso quell'informazione @ChristineCooper. Sembra che abbia usato $original_blog_id
qui per evitare di sovrascrivere $blog_id
;-)

Spero che vada bene se ho aggiunto il tuo commento alla risposta aggiornata @ChristineCooper

Ciao! Vorrei chiedere, come posso implementarlo per farlo funzionare? Devo inserire questo codice nel mio tema o metterlo in functions.php? Grazie!

Vedi la mia risposta qui: https://wordpress.stackexchange.com/questions/307040/wp-rest-api-multisite-get-posts-from-all-sites/307051#307051

Dai un'occhiata al codice nel mio plugin "Multisite Post Reader" https://wordpress.org/plugins/multisite-post-reader/. Utilizza la tecnica descritta nell'altra risposta per scorrere i post. Ho anche plugin che fanno la stessa cosa per le immagini.
Essendo un codice open-source, sei libero di esplorarlo e utilizzarne parti per il tuo uso personale. (Alcune parti del codice sono state modificate da codice open-source che ho trovato.)
