¿Cómo mostrar posts relacionados aleatoriamente que coincidan con "cualquier" etiqueta existente?

7 abr 2015, 21:16:58
Vistas: 14.2K
Votos: 2

Me gustaría preguntar qué código debo agregar para que mis posts relacionados por etiqueta se muestren de forma aleatoria. Obtuve este código de otro lugar.

<?php $orig_post = $post;
global $post;
$tags = wp_get_post_tags($post->ID);
if ($tags) {
$tag_ids = array();
foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;
$args=array(
'tag__in' => $tag_ids,
'post__not_in' => array($post->ID),
'posts_per_page'=>5, // Número de posts relacionados que se mostrarán.
'caller_get_posts'=>1,
'orderby' => 'rand' // Agregar esta línea para orden aleatorio
);
$my_query = new wp_query( $args );
if( $my_query->have_posts() ) {
echo '<div id="related"><h4>Posts Relacionados</h4>';
while( $my_query->have_posts() ) {
$my_query->the_post(); ?>
<div class="ncc">
<h5><a href="<? the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>" rel="nofollow"><?php the_title(); ?></a></h5>
<?php the_excerpt(); ?>

</div><!--ncc-->

<? }
echo '</div><!--related-->';
}
}
$post = $orig_post;
wp_reset_query(); ?>

Para mostrar los posts relacionados de forma aleatoria, simplemente necesitas agregar el parámetro 'orderby' => 'rand' al array $args como se muestra en el código modificado. Esto hará que WordPress ordene los resultados de manera aleatoria.

¿Alguna otra solución? ¡Gracias!

3
Comentarios

Solo necesito saber cómo excluir una etiqueta

Moreentje Moreentje
31 mar 2022 12:32:07
Todas las respuestas a la pregunta 1
5
17

Parte del código en OP está un poco desactualizado y obsoleto, como caller_get_posts que se dejó de usar hace años. El parámetro correcto ahora es ignore_sticky_posts. Además, tu consulta es realmente ineficiente y no es buena para el rendimiento.

Así es como abordaría este problema:

  • Usar get_queried_object_id() para obtener el ID del post actual en lugar del método menos confiable usando el global $post

  • Usar wp_get_post_terms() para devolver todos los IDs de las etiquetas asignadas al post. Por lo que veo, solo necesitamos obtener los IDs, no los objetos completos de las etiquetas

  • Usar un tax_query adecuado para obtener todos los posts que tengan cualquiera de estas etiquetas. Esto es más una preferencia personal ya que es fácil cambiar entre taxonomías y también, mirando el código fuente, los parámetros de etiquetas usan un tax_query

  • Usar rand como valor para el parámetro orderby en WP_Query

En resumen, poniendo todo esto en código: (No probado, requiere PHP 5.4+)

<?php
$tags = wp_get_post_terms( get_queried_object_id(), 'post_tag', ['fields' => 'ids'] );
$args = [
    'post__not_in'        => array( get_queried_object_id() ),
    'posts_per_page'      => 5,
    'ignore_sticky_posts' => 1,
    'orderby'             => 'rand',
    'tax_query' => [
        [
            'taxonomy' => 'post_tag',
            'terms'    => $tags
        ]
    ]
];
$my_query = new wp_query( $args );
if( $my_query->have_posts() ) {
    echo '<div id="related"><h4>Related Posts</h4>';
        while( $my_query->have_posts() ) {
            $my_query->the_post(); ?>
            <div class="ncc">

                <h5><a href="<?php the_permalink()?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h5>
                <?php the_excerpt(); ?>

            </div><!--ncc-->
        <?php }
        wp_reset_postdata();
    echo '</div><!--related-->';
}
?> 
7 abr 2015 21:47:36
Comentarios

¡Hola Peter Goosen, increíble! Tu código funciona muy bien. ¡Muchas gracias! :)

Jornes Jornes
8 abr 2015 06:12:38

Un placer, disfrútalo :-)

Pieter Goosen Pieter Goosen
8 abr 2015 08:49:21

Guau, se ve genial. Otra pregunta: ¿cómo podemos excluir los posts más populares de esta consulta? Las vistas de los posts se almacenan en un campo personalizado llamado (pageView). ¿Es posible hacerlo?

Fatih Toprak Fatih Toprak
12 oct 2016 05:03:35

Sigue funcionando bien en PHP 8... es la calidad Goosen ;)

Jesse Nickles Jesse Nickles
27 ene 2024 11:39:46

No puedo editar actualmente, pero dejo una nota aquí indicando que el fragmento rel="nofollow" debería eliminarse de esta respuesta.

Jesse Nickles Jesse Nickles
29 ene 2024 09:27:17