Site icon WolwX.net

Compteur de vues sur post (articles et pages) pour thème et plugin WordPress (script PHP) avec cookie session

Voilà donc un petit mémo pour une solution basique : Ajouter un compteur de vue sur mes pages ou articles WordPress

En effet, dans le cadre du développement de theme perso WordPress, je suis arrivé à ce besoin de pouvoir afficher le nombre de “views” faites sur un article.

J’ai alors trouvé assez facilement des articles redirigeant en coeur sur un script permettant de faire ceci.
Tous les articles ou sites que je trouvais renvoyés sur ce script et ces variantes :

J’ai donc longtemps essayé d’utiliser la base de ce script, mais avec à la clef, un gros bug dans le comptage des vues, une incrémentation par 2 au lieu de 1 à chaque rafraîchissement de la page …

Je me suis alors rendu compte que j’étais loin d’être un cas isolé dans ce bug, et qu’une piste montrée du doigt le moteur de Chrome qui pouvait boucler des requêtes envoyant une fausse impression de double visite sur la page.
Dans certains cas, on invitait à voir du coté de la favicon mal réglée (absence de l’url renseignée par exemple) en head, ou encore des scripts, ou même autres tags avec cible manquantes ou foireuses.

Dans mon cas rien à faire, malgré toutes ces vérifications le problème persistait, et pour m’assurer que cela venait de Chrome, rien de complexe, tester avec Internet Explorer et bingo …

Du coup j’ai cherché plusieurs manière de corriger le script, ou l’améliorer, jusqu’à me tourner vers l’utilisation d’un Cookie de session tout simplement.

J’ai donc incorporé l’utilisation de ce Cookie, qui permet de limiter le comptage en fonction de la présence de ce celui ci.

Si le cookie existe, alors pas de comptage, dans le cas contraire, comptage et donc forcément, même si le script PHP est bouclé en double par le moteur de Chrome, vue la création du Cookie à la première boucle, la seconde incrémentation ne ce fait pas !
Tests ok, résultat probant, parfait pour mon besoin 🙂

Voici le script, rajouté dans mon functions.php, avec commentaires aidant à compréhension :

/* Function compteur de vue -- DEBUT */
// Récupérer le nombre de vue du post
function getPostViews($postID){
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
// Si le post n'à aucune vue existante dans la table post_meta alors la créer avec la valeur de 0 vue
if($count==''){
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
return "0";
}
return $count;
}

// Régler le nombre de vue du post
function setPostViews($postID) {
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
// Vérification de l'existence d'un cookie ayant pour information l'ID du post, si il existe, ne rien faire, dans le cas contraire créer le cookie et rajouter 1 vue
if(isset($_COOKIE['postviews']) && $_COOKIE['postviews'] == $postID) {
} else {
// Création du cookie, en expiration à 60 secondes
setcookie('postviews', $postID, time()+60);
if($count==''){
$count = 0;
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
}else{
$count++;
update_post_meta($postID, $count_key, $count);
}
}
}

// Remove issues with prefetching adding extra views
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

// Add to a column in WP-Admin
// Rajout des colonnes de vue sur la page admin des articles
add_filter('manage_posts_columns', 'posts_column_views');
add_action('manage_posts_custom_column', 'posts_custom_column_views',5,2);
function posts_column_views($defaults){
$defaults['post_views'] = __('Views');
return $defaults;
}
function posts_custom_column_views($column_name, $id){
if($column_name === 'post_views'){
echo getPostViews(get_the_ID());
}
}

/* Function compteur de vue -- FIN */

Bien entendu, il convient ensuite de rajouter la fonction sur la page article ou post permettant de lancer le script, par exemple sur le fichier single.php (je n’ai rajouté que la ligne seetPostViews) =>

<?php
while ( have_posts() ) :
// update du nombre de vue
setPostViews(get_the_ID());
the_post();

Puis de renseigner le code dans la partie template prévue pour afficher les views, par exemple sur la page \template-parts\content.php =>

<i class="fas fa-eye"></i><?php echo getPostViews(get_the_ID()); if (getPostViews(get_the_ID()) > '1') { ?> <?php esc_html_e( 'vues', 'nomdevotretheme' ); } else { ?> <?php esc_html_e( 'vue', 'nomdevotretheme' ); };?>

Voilà, je n’ai rien fait d’exceptionnel, mais le fonctionnement final est exactement comme je le souhaitai, et ce petit article me servira de mémo au cas ou, alors si il profite à d’autres, tant mieux 😉

Quitter la version mobile