Obține articole din site-urile dintr-o rețea Multisite?
Î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 ?>

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

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

Verifică asta: restore_current_blog() vs switch_to_blog()

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

î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

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

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

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.

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

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

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

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

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

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

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

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!

Vezi răspunsul meu aici: https://wordpress.stackexchange.com/questions/307040/wp-rest-api-multisite-get-posts-from-all-sites/307051#307051

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