Liste des contenus WordPress les plus consultés, sans plugin

L’autre jour j’ai voulu ajouter, en cas de custom post non trouvé dans une catégorie, proposer au visiteur ceux qui sont les plus consultés sur le site. Mais là patatra, comment faire ? Une courte explication sur ce point qui ne nécessite absolument aucun plugin !

Pour cela on va travailler avec les post metas, ou custom fields en quelques sortes. Pour cela, intéressons-nous à get_post_meta et add_post_meta sur le codex. L’idée est de chercher une méta-donnée spécifique à chaque fois qu’un contenu va être visité. Si on ne la trouve pas, on la crée et on va incrémenter (+1) pour la prochaine fois.

Get_post_meta a trois paramètres, on va utiliser les trois. Le premier est l’ID du post. Le second est la clef (ou slug) de la meta-donnée permettant de la retrouver. Le troisième est un booléen que nous allons mettre à true pour avoir en retour de l’appel de la fonction une simple chaine de caractère.

Oui m’enfin, pour la retrouver cette méta-donnée il faut qu’elle existe non ? C’est pour ça qu’on a add_meta_data. On va l’appeler à chaque fois qu’on essaie d’accéder à une méta-donnée qui n’existe pas.

Cette fonction a 4 paramètre, dont trois obligatoires. Nous allons juste regarder ces trois obligatoires : l’ID du post auquel on ajoute la méta-donnée, la clef (ou slug) de la meta-donnée permettant de la retrouver, ainsi que sa valeur.

 

Nous allons maintenant écrire la fonction à simplement ajouter à notre functions.php :

function SetPostViews($postID) {
    $meta_key = 'post_views_count'; //La clef, ou slug, de la méta-donnée
    $count = get_post_meta($postID, $meta_key, true); //Extraction de la valeur, qui est finalement un compteur
    if($count==''): //Si le compte est nul, la méta-donné n'existe pas, on va donc la créer
        $count = 0; //Initialisation à 0
        delete_post_meta($postID, $meta_key); //Simple précaution : si la méta-donnée existait déjà pour un autre usage exotique
        add_post_meta($postID, $meta_key, '0'); //On ajoute la méta-donné
    else:
        $count++; // Si la méta-donnée existe, on l'incrémente
        update_post_meta($postID, $meta_key, $count); //Et on met à jour
    endif;
}

 

Vous pourrez avoir des problèmes d’affichage en fonction de votre version de wordpress ou des plugins déjà installés. Notammentde la pré-recherche de liens associés, ce genre de choses. Pour vous en prémunir, ajoutez ceci à la suite de la fonction :

remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

 

Voilà, c’est fini. Enfin presque, maintenant qu’on a écrit la fonction, il faut bien l’appeler. Pour cela, vous pouvez utiliser un hook avec l’action "wp", mais cela oblige àfaire des tests après pour être sûr que l’on est sur le bon type de contenu, tout ça… Mon conseil, c’est plutôt de rajouter juste au début de la boucle wordpress l’appel à la fonction. Comme ceci :

<?php while ( have_posts() ) : the_post(); SetPostViews(get_the_ID()); ?>

Vous avez ainsi la pleine maîtrise des contenus que vous souhaitez comptabiliser. Et même du contexte. Par exemple, peut-être que vous vous voulez compter le nombre de fois qu’un post apparait dans les archives de telle taxonomy, auquel cas vous n’allez appeler SetPostsViews que dans taxonomy-myslug.php.

L’avantage c’est surtout que comme nous passons en paramètre l’id du post, et bien peu importe que nous soyons dans le cas d’une page, d’un custom post type ou d’un post standard, c’est kif-kif.

Bon, cela dit, nous n’avons pas fini. Comment afficher les posts les plus consultés ? On va faire une petite query. Comme ceci :

 

<?php if ( have_posts() ) : //Si il y a des contenus à afficher ?>
	<ul>
		<?php while ( have_posts() ) : the_post(); //Begin the loop ?>
			<?php get_template_part( 'content', 'whatever' ); //affiche le contenu de content-whatever.php pour chaque entrée trouvée ?>
		<?php endwhile; //End the loop ?>
	</ul>
<?php else : //Aucun contenu trouvé ?>
Désolé, aucune contenu à afficher.
<br />Voici nos contenus les plus populaires :
	<ul>
		<?php
		$popularpost = new WP_Query( array(
			'posts_per_page' => 4,
			'meta_key' => 'post_views_count',
			'orderby' => 'meta_value',
			'order' => 'DESC',
			'post_type' => 'fichemoto',
		) );
		?>
		<?php while ( $popularpost->have_posts() ) : $popularpost->the_post(); ?>
			<?php get_template_part( 'content', 'whatever' ); //affiche le contenu de content-whatever.php pour chaque entrée trouvée ?>
		<?php endwhile; ?>
	</ul>
<?php endif; ?>

 

Le test n’est pas indispensable, ni même le texte "aucun contenu". Bien entendu, vous pouvez tout à fait ajouter ça dans votre barre de widgets, directement dans le fichier sidebar.php ou bien en créant un widget personnalisé. Pour cela, il y a le début de ce post, ou bien le codex avec plein d’exemples !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *