Ottenere articoli da siti in Multisite?

10 mag 2013, 06:25:46
Visualizzazioni: 38.4K
Voti: 20

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 ?>
0
Tutte le risposte alla domanda 2
23
15

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:

demo

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 di switch_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. :)

10 mag 2013 11:24:37
Commenti

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.

DeadArtcore DeadArtcore
10 mag 2013 20:20:32

Ho aggiornato la risposta per supportare categorie diverse.

birgire birgire
10 mag 2013 21:39:59

Controlla questo: restore_current_blog() vs switch_to_blog()

brasofilo brasofilo
10 mag 2013 23:22:31

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

birgire birgire
11 mag 2013 00:17:19

Stephen Harris ha fatto lo stesso per me :)

brasofilo brasofilo
11 mag 2013 02:03:36

Cercherò di trasmetterlo ai miei colleghi utenti di wp ;-)

birgire birgire
11 mag 2013 12:10:41

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

DeadArtcore DeadArtcore
11 mag 2013 18:57:00

qualcuno può aiutarmi?..

DeadArtcore DeadArtcore
11 mag 2013 20:26:26

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.

birgire birgire
11 mag 2013 21:46:06

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

birgire birgire
11 mag 2013 21:54:25

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.

birgire birgire
11 mag 2013 22:08:19

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

DeadArtcore DeadArtcore
11 mag 2013 22:09:59

ok perfetto, buona fortuna ;-)

birgire birgire
11 mag 2013 22:11:57

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

DeadArtcore DeadArtcore
11 mag 2013 22:32:26

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

birgire birgire
12 mag 2013 01:27:14

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

DeadArtcore DeadArtcore
12 mag 2013 02:13:55

Qualcuno può aiutarmi a risolvere?..

DeadArtcore DeadArtcore
12 mag 2013 08:36:41

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. :)

Christine Cooper Christine Cooper
2 apr 2016 18:37:30

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

birgire birgire
2 apr 2016 20:25:48

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

birgire birgire
3 apr 2016 01:48:47

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

Jornes Jornes
26 apr 2020 10:27:32

Grazie! Darò un'occhiata. Ho un altro problema che non è stato ancora risolto perché non è stata data alcuna risposta. Puoi aiutarmi? Ho davvero bisogno di una soluzione per questo. Grazie!

Jornes Jornes
26 apr 2020 13:22:53
Mostra i restanti 18 commenti
0

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.)

15 set 2018 20:30:50