Cómo insertar enlaces de wp_links dentro del bucle de WordPress

10 nov 2010, 18:58:39
Vistas: 1.09K
Votos: 0

Quiero crear un bucle donde se inserten 2 o 3 elementos de mi blogroll de esta manera:

<loop>
    <post1>
    <post2>
    <blogroll1>
    <post3>
    <blogroll3>        
</loop>

Voy a utilizar imágenes y extractos para el bucle, y el objetivo es que los enlaces de wp_links se muestren EXACTAMENTE igual que los wp_posts, por lo que si puedo insertar los enlaces en la variable $post de alguna manera y recorrerlos COMO SI fueran posts, eso sería ideal.

Obtener los enlaces mediante get_bookmarks es fácil, pero ¿cómo haría para que WordPress pensara que son $posts y cómo los insertaría en el objeto $post?

0
Todas las respuestas a la pregunta 3
4

He intentado algo similar a eso (bueno, ligeramente diferente, lo que hice fue intentar crear una línea de tiempo donde las publicaciones y los comentarios aparecieran en la misma cronología)...

Combinar esos dos arreglos no es fácil, porque el objeto de publicación tiene propiedades completamente diferentes al objeto de enlace. Si quisieras hacerlo, tendrías que ejecutar un mapeo de arreglos sobre la respuesta devuelta por get_bookmarks para que cada uno de esos objetos se ajuste a la estructura del objeto $post; luego combinar los dos arreglos, y finalmente ordenarlos usando tu propia función de comparación. Mucho dolor de cabeza para muy poco beneficio.

Si recién estás comenzando con esto, ¿por qué no haces que tus enlaces sean un tipo de publicación personalizada para que puedas combinar tus enlaces y publicaciones en una sola consulta?

O mejor aún, si puedes trabajar con las versiones de desarrollo de 3.1, ¡haz que tus enlaces sean un formato de publicación! De esa manera no hay que modificar la consulta en absoluto, y simplemente funcionará desde el principio.

Edición: Originalmente ingresé este código en una respuesta separada. Estoy siguiendo la recomendación de Jan de combinar mis respuestas en una para que sea más claro.

OK, esto es realmente complicado, y reitero que no recomiendo que hagas esto, pero si tienes que hacerlo, esto debería funcionar:

$links = get_bookmarks('show_updated=true');

/* Mapear las propiedades del enlace a la estructura de un objeto 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>', // el "contenido"
        'post_author' => $obj->link_owner,
        'post_date' => $obj->link_updated,
        'post_status' => 'link', // solo una etiqueta para marcar esto como un enlace
        'guid' => $obj->link_href   );
        return (object)$post_object;
}

/* Combinar enlaces devueltos con publicaciones en la consulta */
global $wp_query;
$posts = array_merge( $wp_query->posts, $linkposts );

/* Ordenar juntos por tu función (esto usa link_updated para fusionar en la línea de tiempo.
    Ten en cuenta que link_updated no es una propiedad confiable en la que depender. */
usort( $posts, 'sortbydate' );
function sortbydate( $a, $b ) {
    return ( strtotime($a->post_date) > strtotime($b->post_date) );
    }

/* ahora solo recorre tu línea de tiempo */
foreach ( $posts as $post ) :
    if ( 'link' == $post->post_status ) {
        // plantilla para enlaces aquí
    } else {
        setup_postdata( $post );
        // plantilla para publicaciones regulares aquí
    }
endforeach;

Además de los otros problemas que preví, noté que el campo link_updated no es muy confiable (muchos enlaces de mi base de datos devolvieron 0 como valor de link_updated). Así que probablemente necesites mirar los datos que tienes y encontrar una función diferente para ordenar tus enlaces y publicaciones.

En serio, considera estar a la vanguardia y migrar todos tus enlaces a publicaciones con el formato "enlace". Creo que para lo que estás intentando hacer, tiene mucho más sentido, y el tiempo requerido para ejecutar un script y crear nuevas publicaciones para cada uno de tus enlaces será mucho menor que la molestia de mantener un formato como este.

10 nov 2010 21:59:47
Comentarios

Lo que mencionaste anteriormente es básicamente lo que estoy intentando hacer, con la excepción de que estaba haciendo un array_splice de los nuevos enlaces "posts" en la variable $post existente

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

Sí, como dije, recomendaría no hacerlo si puedes evitarlo. Usar un formato de post, un tipo de post o incluso una categoría para tus enlaces hará que tus consultas sean mucho más fáciles que usar las funciones de bookmarks. Pero si estás obligado a usar bookmarks, publicaré mis funciones de array map... con suerte eso te llevará la mayor parte del camino.

goldenapples goldenapples
11 nov 2010 00:46:00

Por favor, sí. Estoy trabajando en una base de datos existente, y ya están usando su estructura de enlaces actual, así que no puedo salirme de eso.

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

¡Caramba, gracias! En mi caso particular, no necesito preocuparme por el "tiempo" de los enlaces, solo necesito contar las publicaciones e insertar un enlace.

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

Podrías usar el loop normal de WordPress (sin necesidad de complicaciones) y get_bookmarks($args) para obtener los enlaces que deseas.

Algo como esto:

$i = 1;
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
//tus publicaciones aquí
if ($i&1) echo 'blogroll '.$i;//blogroll 2, 4, etc.
$i++;
<?php endwhile; endif; ?>
15 nov 2010 20:11:10
Comentarios

Probablemente esta es la forma más fácil, sinceramente. Lo he hecho antes con otras cosas. Puede que no sea exactamente lo que necesito para este proyecto, pero definitivamente lo probaré.

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

Gracias a todos. Aquí está la solución con la que finalmente terminé. En lugar de modificar el bucle en sí, opté por engancharme a the_post con una función que recrea el marcado del bucle utilizando datos de $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='Haz clic para leer: "<?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;
}

No es necesario crear una nueva variable para contar, ya que ya existe en $wp_query->current_post

24 nov 2010 01:27:05