¿Cómo mostrar posts relacionados aleatoriamente que coincidan con "cualquier" etiqueta existente?
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!

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 etiquetasUsar 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 untax_query
Usar
rand
como valor para el parámetroorderby
enWP_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-->';
}
?>

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

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?
