Wordpress: Ordenar un listado de posts por los más vistos

Wordpress 

Hoy en día podemos sacar mucho partido a los temas child de Wordpress, ya que permiten la sobrecarga de plantillas individuales, por ejemplo si usamos frameworks como Genesis. Esto quiere decir que podemos hacer modificaciones en las principales plantillas individuales de Wordpress como la home, el archive (listado de posts), el single (ficha del post), las cabeceras, los pies de página etc… y podremos maquetarlas a nuestro gusto siempre teniendo como base la plantilla principal, que no modificamos, al actuar sólo sobre el tema child.

Una de las modificaciones que más se hacen, es ordenar los posts, ya sea en el archive, o en un apartado de la home (por ejemplo un carrusel), por los más vistos. Wordpress no tiene de origen esta característica, ya que implicaría poner un contador a cada post cada vez que alguien lo lee, para determinar así los más vistos. Pero es sencillo de programar:

En primer lugar, metemos en el functions.php (siempre del tema child) una función que se ejecute siempre que se entre en un single, o sea un post. Esa función será la que incremente el contador de visitas de ese post. Las visitas las guardamos en base de datos como “post_meta”, y guardamos el ID del post y la cuenta.

function count_post_visits() {
	if( is_single() ) {
		global $post;
		$views = get_post_meta( $post->ID, 'los_mas_vistos', true );
		if( $views == '' ) {
			update_post_meta( $post->ID, 'los_mas_vistos', '1' );	
		} else {
			$views_no = intval( $views );
			update_post_meta( $post->ID, 'los_mas_vistos', ++$views_no );
		}
	}
}
add_action( 'wp_head', 'count_post_visits' );

A continuación, en el lugar donde queramos sacar ese listado de posts ordenados por más vistos, ponemos el código que va a continuación. Además de ordenarlos por más vistos, vamos sólo a sacar los posts de la categoría que tiene como ID 5.

<?php
$category = get_queried_object();
$taxonomy = array(
array(
'taxonomy' => 'category',
'field' => 'id',
'terms' => 5
),
);
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
//al ser un listado debemos mantener la paginación
$popular_posts_args = array(
'tax_query'=>$taxonomy,
'posts_per_page' => 5,
'paged' => $paged,
'meta_key' => 'los_mas_vistos',
'orderby' => 'meta_value_num',
'order'=> 'DESC'
);
$popular = new WP_Query( $popular_posts_args );
$posts = $popular->posts;
for ($i=0;$i<count($posts);$i++) {
$post=$posts[$i];
$url = get_the_post_thumbnail($post->ID,'thumbnail');
//la imagen destacada
?>
<article id="post-<?php=$i?>" class="list-post">
<div class="post-thumb">
<a href="<?php=$post->guid?>" class="image-link"> <?php=$url?> </a>
</div>
<div class="content">
<div class="post-meta post-meta-c">
<h2 class="post-title">
<a href="<?php=$post->guid?>"><?php=$post->post_title?></a>
</h2>
</div>
<div class="post-content post-excerpt cf"><p><?php=$post->post_content?></p></div>
</div>
</article>
<?php
}
?>
1 comments
  • Manuel
    01-05-2022 10:38
    Buenos días, ante todo gracias por tu artículo. Yo no soy muy docto en php, y en el segundo código indicas que se coloque donde quiera visualizarlo. Podrías dar un ejemplo? en un widget del tema si es posible. Gracias
Leave a comment
I have read and accept the Privacy Policy

The comments sent by each user will always be visible in the corresponding post, and will not be used for any other purpose. The user has the right to access, rectify and suppress said comments, as reflected in our Privacy Policy