popular posts

Cómo mostrar los posts más vistos o populares en WordPress

Probablemente en alguna ocasión te hayas encontrado con la necesidad de mostrar un listado de los posts más vistos o más populares de tu sitio. Es muy normal querer destacar la información más relevante o que más tráfico tiene de tu web. Si son las entradas que más visitan tus usuarios, ¿será por algo no?

Pues bien, por defecto WordPress no tiene ningún mecanismo para almacenar u obtener la información de tus posts más relevantes. Como casi siempre hay un plugin (o varios) que hacen esto.

Siempre que buscas un plugin y encuentras 5 ó 6 que pueden servirte, acabas haciéndote las mismas preguntas y te vienen a la mente los mismos pensamientos:

  • ¿Cuál será el mejor?
  • ¿Cual lleva más tiempo sin actualizarse?, ¿serán seguros?
  • Las opciones que tiene uno no las tiene el otro y viceversa
  • Alguno tiene 1000 opciones de las cuales no comprendo o no sé para que sirven 900 de ellas
  • ¿Influirá en el rendimiento de mi sitio?
  • ¿Podré adaptarlo a mi diseño y a lo que espero según mis necesidades?

No te agobies que en este caso apenas son unas líneas de código, y haciéndolo tu mismo/a tendrás el control 100% de lo que quieres hacer, vamos a ver cómo conseguir esta funcionalidad sin la necesidad de instalar plugins.

Construyendo nuestra propia funcionalidad para obtener los posts más vistos o más populares sin plugins

Simplemente añade estas 2 funciones en tu functions.php, y después te explico que hace cada una de ellas:

<?php

// Función para contar visualizaciones de un post.
function set_post_views() {
    if ( is_single() ) {
        $post_ID = get_the_ID();
        $count = get_post_meta( $post_ID, 'post_views', true );

        if ( $count == '' ) {
            delete_post_meta( $post_ID, 'post_views' );
            add_post_meta( $post_ID, 'post_views', 1 );
        } else {
            update_post_meta( $post_ID, 'post_views', ++$count );
        }
    }
}
add_action( 'wp', 'set_post_views' );

// Función para obtener el número de visualizaciones de un post
function get_post_views( $post_ID ){
    $count = get_post_meta($post_ID, 'post_views', true);

    if ( $count == '' ){
        delete_post_meta($post_ID, 'post_views');
        add_post_meta($post_ID, 'post_views', 0);
        return 0;
    }

    return $count;
}

En primer lugar tenemos la función set_post_views() que utilizaremos para ir contando las visitas a nuestros posts. La manera de hacerlo es agregando esta función al hook wp. En este punto podemos preguntar si estamos en un single o detalle de un post. En este caso obtenemos el ID y consultamos las visualizaciones que tiene nuestro post a través de un custom field que hemos llamado «post_views«. En caso de estar vacío (la primera vez que visitamos un post), lo establecemos a «1». En caso de tener un valor simplemente sumamos 1 más al valor (++$count). Con esta función estaremos contabilizando cada vez que alguien visualiza un post.

La segunda función get_post_views() la utilizaremos para mostrar el número de visualizaciones de nuestro post. Como tenemos el control absoluto, podríamos llamar a este dato en un listado de posts y poner el número de visualizaciones en un label o badge, o simplemente poner un texto tipo: Este post ha sido visto N veces. Por ejemplo, en el loop del single.php podríamos poner algo como esto:

<?php

/* Start the Loop */
while ( have_posts() ) : the_post();
    $post_views = get_post_views(get_the_ID());?>

    <p>Este post ha sido visto <?php echo sprintf( _n( '%s vez', '%s veces', $post_views, 'your_textdomain' ), $post_views );?></p>

    <?php
endwhile;
/* End of the loop.*/

Ahora si queremos mostrar un listado de los posts más vistos o populares por ejemplo en el sidebar de nuestro sitio, tendremos que hacer una consulta como esta:

<?php

$args = array(
    'posts_per_page' => 4,
    'meta_key' => 'post_views',
    'orderby' => 'meta_value_num',
    'order' => 'DESC'
);

$popular_posts = new WP_Query( $args );
while ( $popular_posts->have_posts() ) : $popular_posts->the_post();?>

    <h2><?php the_title();?></h2>
    <?php the_excerpt();

endwhile;

Esta consulta te devolcerá los 4 posts con mayor número de visualizaciones. La maquetación o cómo quieras mostrarlo ya lo dejo a tu imaginación

Añadiendo esta información al wp-admin

Como lo estamos haciendo a pedir de boca, vamos a añadir la información de los post más vistos o post más populares al listado de posts de wp-admin. Ésto lo conseguimos agregando al functions.php las siguientes funciones enganchadas a los hooks manage_posts_columns y manage_posts_custom_column:

<?php

// Añadir columna al listado de post de wp-admin
function posts_column_views( $defaults ){
    $defaults['post_views'] = __('Vistas', 'your_textdomain');

    return $defaults;
}
add_filter( 'manage_posts_columns', 'posts_column_views' );

function posts_custom_column_views( $column_name, $id ){
    if ( $column_name === 'post_views' ){
        echo get_post_views( get_the_ID() );
    }
}
add_action( 'manage_posts_custom_column', 'posts_custom_column_views', 5, 2 );

Estas funciones lo que hacen es añadir una columna más al listado de posts con el número de visualizaciones que tiene cada post.

¿Qué más puedo hacer?

Como decía antes, haciéndolo a mano tienes el control total de lo que quieres hacer, cómo lo quieres hacer, cómo lo vas a mostrar y dónde lo vas a mostrar.

A tu imaginación dejo si quieres tener un control más exhaustivo por ejemplo controlando factores como:

  • Si lo que visita tu post es un bot
  • Si quieres controlarlo por país
  • Si quieres contar o no los usuarios logueados
  • Si quieres controlar o no si un mismo usuario visita una entrada varias veces

Adáptalo a tus necesidades.

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

16 comentarios en Cómo mostrar los posts más vistos o populares en WordPress

    1. Hola

      Pues aunque la definición la has hecho en una línea, la resolución tiene mucha miga. En este ejemplo simplemente guardo un dato asociado a un post. Pero ese dato no tiene fecha.

      Te toca investigar, así de primeras no se me ocurre si es mejor solución serializar el dato (añadiendo la fecha), pero eso implicaría unas consultas muy complejas, o crear una tabla independiente donde puedas guardar los votos y las fechas en diferentes campos, con otro campo para relacionar con el ID del post…

      Saludos

  1. Hola Pablo,

    Te recomendaría que trazaras con Xdebug el procesado de la página paso por paso e intentes identificar el patrón de comportamiento o porqué está entrando dos veces en la función. En este tipo de problemas no te queda otra

    Saludos y suerte

  2. Muy bueno el post, como puedo hacer para que aparezca el nuemero en cada post? es decir, 1, 2, 3, asi sucesivamente para armar un rankig de lo más leído

  3. Hola, como puedo colocarlo en el sidebar pero no incluyendo el codigo en el archivo sidebar.php ya que de esta forma se coloca al final del sidebar o al principio y me gustaria colocar a eleccion en una parte especifica

      1. Lo que estuve intentando es hacerlo un widget directamente, sigiendo algunos tutoriales, pero este codigo no lo puedo implementar, porque al hacerlo por alguna razon me niega el acceso el wp-admin diciendo que tengo las cookies bloqueadas y era problema del widget, no tengo idea como se haria para hacerla shortcode :/

    1. Hola Jony. Si, sólo tendrías que meter el código dentro de un if donde compruebes que los parámetros son esos que indicas

    1. Hola Aitana. No he trabajado nunca con Elementor, pero imagino que tendrá documentación donde podrás encontrar cómo crear un bloque. Te recomendaría que investigues por ahí

    1. Hola Jose

      Si los vas a pintar en un template, puedes generar el HTML que necesites sin problema. En el ejemplo hago una wp_query y pinto el título en un «h2» y el extracto, pero ahí puedes poner el HTML que necesites

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *:

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios