Mostrar los Artículos más vistos, sin que afecte a la velocidad de carga

Analizando la web de un cliente para mejorar la carga de la web, descubrimos que el plugin «WP-PostViews» realizaba peticiones ajax a través de «admin-ajax.php» cada vez que cargaba una página.
El plugin lo utilizaba para saber cuál es la página más vista, pero no tiene sentido que lo haga sobre páginas como la Home, contacto, etc. Lo normal es hacerlo sobre los artículos del blog, por ejemplo, para saber cuál es artículo más visto y mostrarlo en un listado de los 5 más top.
Además, no es recomendable hacer peticiones a «admin-ajax.php» en la carga de la página porque las peticiones son lentas ,y consume bastantes recursos del servidor. Comprobamos que la petición consumía entre 3.000 ms y 5.000 ms ,según el caso.

Estuvimos mirando alternativas como el plugin «Post Views Counter», o «Simple Post Views Count», pero necesitábamos algo sencillo. Con hacer lo mismo que hacía el plugin del cliente, pero solo en los artículos, y por API REST en lugar de «admin-ajax.php», teníamos suficiente.
Decidimos crear un plugin y subirlo al repositorio WordPress, y conseguimos varios objetivos:
- Solucionar el problema del cliente.
- Aportar nuestro granito de arena a la comunidad de WordPress.
- Que otras personas pudieran utilizar y hacer sus páginas web más rápidas.
Optimizar peticiones AJAX por admin-ajax.php
Más que optimizar la petición, lo que hicimos fue quitarla y crear un Endpoint especifico para esa función. También decidimos retrasar la petición 8 segundos después de que cargara la página para que no afectara a la velocidad de carga, de forma que si una persona no se mantiene en la página ese tiempo mejor no contarla.


La petición únicamente se realiza en las entradas/post, y lo único que hace es sumar «uno» al contador de visitas de esa página. Con este cambio hemos reducido el tiempo a la mitad más o menos, y lo mejor de todo es que solo se ejecuta dónde lo necesitamos.
El valor lo guardamos en el post meta llamado «views».
Código para mostrar los 5 artículos más vistos en el último mes.
Ahora vamos a ver un ejemplo del código que tendríamos que poner para mostrar los cinco post más vistos en el último mes.
$mes_actual = date( 'Y-m-d', strtotime('0 month') ) . ' 00:00:00';
$mes_anterior = date( 'Y-m-d', strtotime('-1 month') ) . ' 00:00:00';
$sql = '
SELECT DISTINCT p.ID, p.post_date, p.post_name, p.post_title, (meta_value+0) AS views
FROM ' . $wpdb->prefix . 'posts p, ' . $wpdb->prefix . 'postmeta pm
WHERE pm.post_id = p.ID
AND post_date < %s
AND post_date > %s
AND post_type = "post"
AND post_status = "publish"
AND meta_key = "views"
ORDER BY views DESC LIMIT 5
';
$most_viewed = $wpdb->get_results( $wpdb->prepare( $sql, $mes_actual, $mes_anterior ) );
$wpdb->flush();
if ( !empty( $most_viewed ) ) {
foreach ( $most_viewed as $item ) {
// Código mostrar la información del artículo.
$post_id = $item->ID;
$views = get_post_meta( $post_id, 'views', true );
echo '<p>'. $item->post_title .' -> '. $views .'</p>';
// ...
}
}
Conclusión
Hemos intentado que el plugin «Bubuku post view count» sea lo más sencillo posible para poderlo integrar fácilmente en los desarrollos. De todas formas, si vemos que la comunidad demanda que se pueda utilizar para otro tipo de «post», como los productos de WooCommerce, o un bloque de Gutenberg, para poder definir el número de noticias, tiempo, con imagen, etc. lo añadiríamos en próximas versiones.