Come inserire link wp_links all'interno del loop in WordPress?

10 nov 2010, 18:58:39
Visualizzazioni: 1.09K
Voti: 0

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?

0
Tutte le risposte alla domanda 3
4

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.

10 nov 2010 21:59:47
Commenti

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

Dan Gayle Dan Gayle
11 nov 2010 00:15:14

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.

goldenapples goldenapples
11 nov 2010 00:46:00

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.

Dan Gayle Dan Gayle
12 nov 2010 21:04:30

Accidenti, grazie! Nel mio caso specifico, non devo preoccuparmi del "tempo" dei link, ho solo bisogno di contare i post e inserire un link.

Dan Gayle Dan Gayle
15 nov 2010 18:43:32
1

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; ?>
15 nov 2010 20:11:10
Commenti

Probabilmente questo è il modo più semplice, sinceramente. L'ho già fatto prima con altre cose. Potrebbe non essere ciò di cui ho bisogno per questo progetto, ma lo proverò sicuramente.

Dan Gayle Dan Gayle
16 nov 2010 01:17:35
0

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

24 nov 2010 01:27:05