Come inserire link wp_links all'interno del loop in WordPress?
Voglio creare un loop in cui 2 o 3 elementi del mio blogroll vengono inseriti in questo modo:
<loop>
<post1>
<post2>
<blogroll1>
<post3>
<blogroll3>
</loop>
Utilizzerò immagini ed estratti per il loop, e l'obiettivo è far sì che i link di wp_links
vengano visualizzati ESATTAMENTE come quelli di wp_posts
, quindi se riuscissi effettivamente a inserire i link nella variabile $post
in qualche modo e a ciclarli COME SE fossero post, sarebbe perfetto.
Ottenere i post tramite get_bookmarks
è semplice, ma come potrei far credere a WP che siano $posts
e come potrei inserirli nell'oggetto $post
?

Ho provato qualcosa di simile (beh, leggermente diverso, quello che ho fatto è stato cercare di creare una timeline dove post e commenti apparivano nella stessa sequenza temporale)...
Unire quei due array non è semplice, perché l'oggetto post ha proprietà completamente diverse dall'oggetto link. Se volessi farlo, dovresti eseguire un array map sulla risposta restituita da get_bookmarks
per far sì che ciascuno di quegli oggetti rispetti la struttura dell'oggetto $post; poi unire i due array, e infine usare usort con una tua funzione di confronto. Un sacco di mal di testa per un guadagno minimo.
Se stai appena iniziando con questo, perché non rendi i tuoi link un custom post type così da poter unire link e post in una singola query?
O ancora meglio, se puoi lavorare con le versioni di sviluppo di 3.1, rendi i tuoi link un formato di post! In questo modo non ci saranno problemi con la query, e funzionerà subito senza modifiche.
Modifica: Originariamente ho inserito questo codice in una risposta separata. Seguo il consiglio di Jan di combinare le mie risposte in una sola per maggiore chiarezza.
OK, questo è davvero strambo, e ribadisco che non ti consiglio di farlo, ma se proprio devi, questo dovrebbe funzionare:
$links = get_bookmarks('show_updated=true');
/* Mappa le proprietà del link alla struttura di un oggetto 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>', // il "contenuto"
'post_author' => $obj->link_owner,
'post_date' => $obj->link_updated,
'post_status' => 'link', // solo un tag per identificare questo come link
'guid' => $obj->link_href );
return (object)$post_object;
}
/* Unisci i link restituiti con i post nella query */
global $wp_query;
$posts = array_merge( $wp_query->posts, $linkposts );
/* Ordina insieme con la tua funzione (questo usa la data link_updated per fondere nella timeline.
Nota che link_updated non è una proprietà affidabile da usare. */
usort( $posts, 'sortbydate' );
function sortbydate( $a, $b ) {
return ( strtotime($a->post_date) > strtotime($b->post_date) );
}
/* ora scorri semplicemente la tua timeline */
foreach ( $posts as $post ) :
if ( 'link' == $post->post_status ) {
// template per i link qui
} else {
setup_postdata( $post );
// template per i post regolari qui
}
endforeach;
Oltre agli altri problemi che avevo previsto, ho notato che il campo link_updated non è molto affidabile (molti link nel mio database restituivano 0 come valore di link_updated). Quindi probabilmente devi dare un'occhiata ai dati che hai e trovare una diversa funzione per ordinare i tuoi link e post.
Seriamente, però, considera l'idea di passare all'avanguardia e migrare tutti i tuoi link in post con il formato "link". Penso che per quello che stai cercando di fare, abbia molto più senso, e il tempo necessario per eseguire uno script e creare nuovi post per ciascuno dei tuoi link sarà molto minore del fastidio di mantenere un formato come questo.

Quello che hai detto sopra è fondamentalmente quello che sto cercando di fare, con l'eccezione che stavo facendo un array_splice dei nuovi link "posts" nella variabile $post
esistente

Sì, come ho detto, ti consiglierei di non farlo se puoi evitarlo. Usare un formato post, un tipo di post o anche una categoria per i tuoi link renderà le tue query molto più semplici rispetto all'uso delle funzioni dei segnalibri. Ma se sei vincolato all'uso dei segnalibri, posterò le mie funzioni di array map... spero che ti possano aiutare a fare la maggior parte del lavoro.

Per favore, sì. Sto lavorando su un database esistente e stanno già usando la loro struttura di link esistente, quindi non posso davvero uscire da quella.

Potresti usare il normale loop di WordPress (senza bisogno di complicazioni) e get_bookmarks($args) per ottenere i link che desideri.
Qualcosa come questo:
$i = 1;
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
//i tuoi post qui
if ($i&1) echo 'blogroll '.$i;//blogroll 2, 4, ecc.
$i++;
<?php endwhile; endif; ?>

Grazie a tutti. Ecco la soluzione con cui ho finito per procedere. Invece di intervenire direttamente nel loop stesso, ho scelto di agganciarmi a the_post
con una funzione che ricrea il markup del loop utilizzando i dati da $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='Clicca per leggere: "<?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;
}
Non c'è bisogno di creare una nuova variabile per il conteggio, visto che esiste già in $wp_query->current_post
