Cum să intercalezi link-uri wp_links în bucla WordPress?
Vreau să creez o buclă în care 2 sau 3 elemente din blogroll-ul meu să fie intercalate astfel:
<loop>
<post1>
<post2>
<blogroll1>
<post3>
<blogroll3>
</loop>
Voi folosi imagini și fragmente pentru buclă, iar scopul este ca link-urile wp_links
să fie afișate EXACT ca wp_posts
, așa că dacă aș putea de fapt să intercalez link-urile în variabila $post
cumva și să le parcurg CA ȘI CÂND ar fi postări, ar fi perfect.
Obținerea link-urilor via get_bookmarks
este ușoară, dar cum aș putea să fac WordPress să creadă că sunt $posts
și cum aș putea să le intercalez în obiectul $post
?

Am încercat ceva similar cu asta (ei bine, puțin diferit, ceea ce am făcut a fost să încerc să creez o cronologie în care postările și comentariile să apară în aceeași cronologie)...
Combinarea acestor două array-uri nu este ușoară, deoarece obiectul post are proprietăți complet diferite față de obiectul link. Dacă ai vrea să faci asta, ar trebui să rulezi un array map peste răspunsul returnat de get_bookmarks
pentru a face fiecare dintre aceste obiecte să se conformeze structurii obiectului $post; apoi să combinezi cele două array-uri și, în final, să le sortezi folosind propria funcție de comparare. Multă bătaie de cap pentru un câștig foarte mic.
Dacă abia începi cu asta, de ce nu faci linkurile tale un tip personalizat de postare (custom post type) astfel încât să poți combina linkurile și postările într-un singur query?
Sau, și mai bine, dacă poți lucra cu versiunile de dezvoltare ale WordPress 3.1, fă linkurile tale un format de postare! În acest fel, nu va trebui să te complici deloc cu query-ul, și va funcționa imediat pentru tine.
Editare: Inițial am introdus acest cod într-un răspuns separat. Urmez recomandarea lui Jan să combin răspunsurile într-unul singur pentru a fi mai clar.
OK, deci acest lucru este foarte ciudat și reiter că nu recomand să faci asta, dar dacă trebuie, acest cod ar trebui să funcționeze:
$links = get_bookmarks('show_updated=true');
/* Mapează proprietățile linkului la structura unui obiect post */
$linkposts = array_map( 'link2postobj', $links );
function link2postobj( $obj ) {
$post_object = array(
'post_name' => $obj->link_name,
'post_content' => '<a href="'.$obj->link_href.'" >'.
$obj->link_name.'</a><p>'.
$obj->link_description.'</p>', // "conținutul"
'post_author' => $obj->link_owner,
'post_date' => $obj->link_updated,
'post_status' => 'link', // doar un tag pentru a marca acest lucru ca fiind un link
'guid' => $obj->link_href );
return (object)$post_object;
}
/* Combină linkurile returnate cu postările din query */
global $wp_query;
$posts = array_merge( $wp_query->posts, $linkposts );
/* Sortează împreună folosind funcția ta (aceasta folosește data link_updated pentru a combina în cronologie.
Reține că link_updated nu este o proprietate de încredere pe care să te bazezi. */
usort( $posts, 'sortbydate' );
function sortbydate( $a, $b ) {
return ( strtotime($a->post_date) > strtotime($b->post_date) );
}
/* acum doar parcurge cronologia ta */
foreach ( $posts as $post ) :
if ( 'link' == $post->post_status ) {
// template pentru linkuri aici
} else {
setup_postdata( $post );
// template pentru postări obișnuite aici
}
endforeach;
Pe lângă celelalte probleme pe care le-am prevăzut, am observat că câmpul link_updated nu este foarte fiabil (multe linkuri din baza mea de date au returnat 0 ca valoare pentru link_updated). Așadar, probabil va trebui să te uiți la datele pe care le ai și să găsești o altă funcție pentru a sorta linkurile și postările tale.
Serios, totuși, ia în considerare să treci la ultima versiune și să migrezi toate linkurile tale în postări cu formatul "link". Cred că pentru ceea ce încerci să faci, are mult mai mult sens, iar timpul necesar pentru a rula un script și a crea postări noi pentru fiecare dintre linkurile tale va fi mult mai mic decât bătaia de cap de a menține un format ca acesta.

Ceea ce ai spus mai sus este practic ceea ce încerc să fac, cu excepția faptului că încercam să fac un array_splice al noilor link-uri "posts" în variabila existentă $post

Da, cum am spus, aș recomanda să nu faci asta dacă poți evita. Folosirea unui format de postare, a unui tip de postare sau chiar a unei categorii pentru link-urile tale va face interogările mult mai ușoare decât utilizarea funcțiilor de bookmark-uri. Dar dacă ești obligat să folosești bookmark-uri, voi posta funcțiile mele cu array map... sper că te vor ajuta să ajungi aproape acolo.

Te rog, da. Lucrez la o bază de date existentă și ei folosesc deja structura existentă de link-uri, așa că nu pot să mă detașez de ea.

Poți folosi bucla normală wp (nu e nevoie de complicații) și get_bookmarks($args) pentru a obține linkurile dorite.
Ceva de genul:
$i = 1;
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
//postările tale aici
if ($i&1) echo 'blogroll '.$i;//blogroll 2, 4, etc.
$i++;
<?php endwhile; endif; ?>

Mulțumesc tuturor. Iată soluția cu care am rămas în final. În loc să mă complic în bucla în sine, am ales să folosesc un hook în the_post
cu o funcție care recreează markup-ul buclei folosind date din $links
.
<?php
global $links;
global $links_count;
$links = get_bookmarks("limit=5");
function dg_archive_insert_links(){
global $post;
if (!is_singular()){
add_action('the_post', 'dg_insert_links');
}
}
add_action('wp', 'dg_archive_insert_links');
function dg_insert_links(){
global $wp_query;
global $links_count;
global $links;
if ( ($wp_query->current_post % 3) == 0 && ($wp_query->current_post > 0) && $links[$links_count]->link_url):
?>
<div class="post type-post hentry">
<h2><a href="<?php echo $links[$links_count]->link_url; ?>" rel="bookmark" title='Click to read: "<?php echo $links[$links_count]->link_name; ?>"'><?php echo $links[$links_count]->link_name; ?></a></h2>
<?php if ($links[$links_count]->link_description): ?><div class="entry-summary"><?php echo $links[$links_count]->link_description; ?></div><?php endif; ?>
<?php if ($links[$links_count]->link_image && $links[$links_count]->link_description): ?>
<a href="<?php echo $links[$links_count]->link_url; ?>" rel="bookmark" title="<?php echo $links[$links_count]->link_description; ?>" class="post_thumbnail" ><img src="<?php echo $links[$links_count]->link_image; ?>" width="150px" alt="<?php echo $links[$links_count]->link_description; ?>" /> </a>
<?php endif; ?>
</div>
<?php
$links_count++;
endif;
}
Nu este nevoie să creez o nouă variabilă pentru numărare, deoarece aceasta există deja în $wp_query->current_post
.
