Obține articole din site-urile dintr-o rețea Multisite?

10 mai 2013, 06:25:46
Vizualizări: 38.4K
Voturi: 20

Încerc să extrag articole din mai multe site-uri. De exemplu, pot extrage articolele dintr-un singur site după categorie și un total de 10 articole.

Dar încerc să extrag articole din două bloguri separate din Multisite, 1 și 2. Însă funcționează doar pentru blogul 1. De asemenea, vreau să extrag o altă categorie din blogul 1 și blogul 2 după o altă categorie. Cum pot realiza acest lucru?

Iată ce încerc să fac:

<?php
global $switched;
switch_to_blog(1,2); //comută la 1 și 2 dar funcționează doar 1

// Obține ultimele articole
$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(); //comută înapoi la site-ul principal ?>
0
Toate răspunsurile la întrebare 2
23
15

Funcția WordPress switch_to_blog() așteaptă un întreg ca parametru de intrare. Puteți citi mai multe despre aceasta în Codex:

http://codex.wordpress.org/Function_Reference/switch_to_blog

Încercați această structură în schimb:

// Obține ID-ul blogului curent
$original_blog_id = get_current_blog_id(); 

// Toate ID-urile de bloguri prin care să iterăm
$bids = array( 1, 2 ); 

foreach( $bids as $bid )
{
    // Schimbă la blogul cu ID-ul $bid
    switch_to_blog( $bid ); 

    // ... codul tău pentru fiecare blog ...
}

// Revino la blogul curent
switch_to_blog( $original_blog_id ); 

Actualizare:

Dacă doriți să preluați postări din diferite categorii pentru fiecare blog, puteți folosi de exemplu:

// Obține blogul curent
$original_blog_id = get_current_blog_id(); 

// Configurează un slug de categorie pentru fiecare ID de blog prin care să iterăm - EDITEZĂ
$catslug_per_blog_id = array( 
    1 => 'video',
    4 => 'news' 
); 

foreach( $catslug_per_blog_id as $bid => $catslug )
{
    // Schimbă la blogul cu ID-ul $bid
    switch_to_blog( $bid ); 

    // ... codul tău pentru fiecare blog ...
    $myposts = get_posts( 
        array( 
            'category_name'  => $catslug,
            'posts_per_page' => 10, 
        )
    );
    // ... etc
}

// Revino la blogul curent
switch_to_blog( $original_blog_id ); 

Exemplu:

Iată un exemplu care vă permite să folosiți template tags (acest cod funcționează pe instalarea mea multisite):

// Obține blogul curent
$original_blog_id = get_current_blog_id();

// Configurează o categorie pentru fiecare ID de blog prin care să iterăm - EDITEZĂ
$catslug_per_blog_id = array( 
    1 => 'video',
    4 => 'news' 
); 

foreach( $catslug_per_blog_id as $bid => $catslug )
{
    //Schimbă la blogul cu ID-ul $bid
    switch_to_blog( $bid ); 

    // Obține postări pentru fiecare blog
    $myposts = get_posts( 
        array( 
            'category_name'  => $catslug,
            'posts_per_page' => 2, 
        )
    );

    // Sări peste blog dacă nu se găsesc postări
    if( empty( $myposts ) )
        continue;

    // Iterează pentru fiecare 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
        );
    }

    // Afișează pentru fiecare blog
    printf(
        '<h2>%s (%s)</h2><ul>%s</ul>',
        esc_html( get_bloginfo( 'name' ) ),
        esc_html( $catslug ),
        $li  
    );
}

// Revino la blogul curent
switch_to_blog( $original_blog_id ); 

wp_reset_postdata();

Iată un screenshot demo pentru exemplul nostru de mai sus cu site-ul 1 numit Beethoven și site-ul 4 numit Bach:

demo

PS: Mulțumesc lui @brasofilo pentru link care clarifică neînțelegerea mea despre restore_current_blog() ;-)

PPS: Mulțumesc lui @ChristineCooper pentru următorul comentariu:

Doar un avertisment prietenos. Asigurați-vă că nu setați ID-ul blogului original la variabila $blog_id -- acest lucru se întâmplă deoarece în timpul procesului switch_to_blog(), $blog_id va fi suprascris de funcția de bază, ceea ce înseamnă că când încercați să reveniți la blogul original, veți ajunge să comutați la ultimul prin care ați iterat. Un mic puzzle mental. :)

10 mai 2013 11:24:37
Comentarii

așa încarc postările mele http://pastie.org/7827649 cum pot implementa asta și aici așa cum am menționat prin ambele ID-uri de blog, dar fiecare ID de blog după o categorie specifică, blogul 1 va avea categoria videoclipuri, iar blogul 2 va avea categoria știri, de asemenea, să obțin un total de 10 postări limită.

DeadArtcore DeadArtcore
10 mai 2013 20:20:32

Am actualizat răspunsul pentru a suporta categorii diferite.

birgire birgire
10 mai 2013 21:39:59

Verifică asta: restore_current_blog() vs switch_to_blog()

brasofilo brasofilo
10 mai 2013 23:22:31

@brasofilo, mulțumesc mult pentru link, asta îmi schimbă perspectiva asupra restore_current_blog() ;-)

birgire birgire
11 mai 2013 00:17:19

Stephen Harris a făcut același lucru pentru mine :)

brasofilo brasofilo
11 mai 2013 02:03:36

O să încerc să transmit asta și altor utilizatori de wp ;-)

birgire birgire
11 mai 2013 12:10:41

încă întâmpin o problemă, afișează doar un singur post pe blogul original multisite, atât. iată cum am făcut http://pastie.org/7831263

DeadArtcore DeadArtcore
11 mai 2013 18:57:00

are cineva nevoie de ajutor?..

DeadArtcore DeadArtcore
11 mai 2013 20:26:26

Încearcă exemplul simplu pe care l-am adăugat la răspuns și asigură-te că blogurile și categoriile tale sunt corecte. Dacă funcționează, atunci ar trebui să poți să-l extinzi în funcție de nevoile tale.

birgire birgire
11 mai 2013 21:46:06

în versiunea ta pastie nr 2, codul tău ar trebui să fie în interiorul buclei foreach unde am marcat // ... etc

birgire birgire
11 mai 2013 21:54:25

ps: am actualizat din nou exemplul, așa că poți folosi tag-uri de template precum the_title() în loc de $post->post_title ;-) Sper că ți-am oferit suficiente informații ca să poți finaliza proiectul tău.

birgire birgire
11 mai 2013 22:08:19

mersi, o să-ți spun dacă a funcționat, mulțumesc pentru ajutorul tău minunat :D

DeadArtcore DeadArtcore
11 mai 2013 22:09:59

ok, foarte bine, noroc ;-)

birgire birgire
11 mai 2013 22:11:57

uite, problema este că totul se afișează bine, dar afișează totul într-o listă, știi cum am postat în pastie-ul meu, așa vreau să fie pentru că doar să pun titlu și toate acele detalii e puțin complicat pentru mine, nu sunt foarte cunoscător. Există vreo modalitate să se realizeze în felul simplu în care l-am avut? Există vreo cale să-l păstrez așa? http://pastie.org/7896095 îmi pare rău că deranjez, sper că înțelegi

DeadArtcore DeadArtcore
11 mai 2013 22:32:26

Înlocuiește foreach($rightbox as $post) cu foreach($posts as $post) în pastie-ul tău.

birgire birgire
12 mai 2013 01:27:14

Am primit o eroare de parsare: eroare de sintaxă, $end neașteptat în index.php, așa că am adăugat doar acel cod în index.php și primesc acea eroare. Iată versiunea actualizată http://pastie.org/7896699

DeadArtcore DeadArtcore
12 mai 2013 02:13:55

poate cineva să mă ajute să rezolv asta?..

DeadArtcore DeadArtcore
12 mai 2013 08:36:41

Doar un avertisment prietenos. Asigurați-vă că nu setați ID-ul blogului original la variabila $blog_id -- acest lucru se întâmplă deoarece în timpul procesului switch_to_blog(), $blog_id va fi suprascris de funcția de bază, ceea ce înseamnă că atunci când încercați să reveniți la blogul original, veți ajunge să treceți la ultimul prin care ați parcurs. Un pic de puzzle mental. :)

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

mulțumesc pentru informație @ChristineCooper. Se pare că am folosit $original_blog_id aici pentru a evita suprascrierea variabilei $blog_id ;-)

birgire birgire
2 apr. 2016 20:25:48

Sper că e în regulă că am adăugat comentariul tău la răspunsul actualizat @ChristineCooper

birgire birgire
3 apr. 2016 01:48:47

Bună! Aș dori să întreb, cum implementez codul ca să funcționeze? Trebuie să-l pun în tema mea sau în fișierul functions.php? Mulțumesc!

Jornes Jornes
26 apr. 2020 10:27:32

Mulțumesc! O să mă uit la el. Am o altă problemă care încă nu a fost rezolvată, deoarece nu s-a dat niciun răspuns. Poți să mă ajuți cu asta? Chiar am nevoie de o soluție pentru aceasta. Mulțumesc!

Jornes Jornes
26 apr. 2020 13:22:53
Arată celelalte 18 comentarii
0

Aruncați o privire la codul din plugin-ul meu "Multisite Post Reader" https://wordpress.org/plugins/multisite-post-reader/. Acesta folosește tehnica prezentată în celălalt răspuns pentru a parcurge postările. De asemenea, am plugin-uri care fac același lucru pentru imagini.

Deoarece este un cod open-source, sunteți binevenit să răsfoiți codul și să utilizați părți din el pentru propriile nevoi. (O parte din cod este modificată din cod open-source pe care l-am găsit.)

15 sept. 2018 20:30:50