Tout savoir sur WordPress
Tutoriel WordPress

Créer un système de points pour les commentaires

Ce tutoriel vous apprendra à implanter un système de points pour vos membres. Les points seront récoltés après l’ajout du premier commentaire sur un article.

Ce tuto est dédié à l’attribution de points après l’ajout d’un commentaire par l’un des membres enregistrés sur votre blog WordPress. Ce système est idéal si vous souhaitez fidéliser et/ou récompenser vos membres les plus actifs.

En pleine préparation de la V2 de GeekPress, je vous dévoile la mise en place de l’un des prochains “petits plus” qui composera cette nouvelle version.

Nous allons voir trois cas de figure pour l’attribution des points. Tout d’abord, il faut vérifier l’ajout d’un commentaire via le formulaire de soumission.
Ensuite, on vérifie le cas où l’administrateur doit valider le commentaire avant sa mise en ligne et la suppression de points en cas de non approbation ou suppression du commentaire.

Dans notre tutoriel, le membre gagne 5 points à chaque nouveau “premier” commentaire sur un article. Un membre qui poste 3 commentaires sur un article remportera uniquement 5 points !

Ajout des points sans approbation

Avant toutes choses, il faut savoir que lorsqu’un commentaire est posté à partir du formulaire de soumission, on doit utiliser le hook comment_post. Ce hook prendra effet juste après l’insertion du commentaire dans la base de données. C’est-à-dire que le commentaire est déjà approuvé lors de l’appel du hook si l’administration ne demande pas son approbation pour la mise en ligne.

Commençons par créer le hook et la fonction d’appel plus les différentes variables global nécessaire au script..
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function add_points() {
    global $current_user;
    global $wpdb;
    global $post;
}
add_action('comment_post', 'add_points');

[/pastacode]

  • $current_user retourne un objet contenant les informations de l’utilisateur qui poste le commentaire.
  • $wpdb est un objet qui va permettre de réaliser des requêtes sécurisées sur notre base de données.
  • $post retourne un objet qui contient les informations de l’article où l’utilisateur vient de poster l’article.

La première vérification à faire est de savoir si le commentaire a été poster par un membre.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function add_points() {

    global $current_user;
    global $wpdb;
    global $post;

    // On verifie un membre poste un commentaire
    if( $current_user ) {

    }
}
add_action('comment_post', 'add_points');

[/pastacode]
Après avoir vérifié que le commentaire a été posté par un membre, on compte son nombre de point actuel et on vérifie si son commentaire posté est le premier sur l’article courant.

Si le membre poste son premier commentaire sur l’article, on met à jour son total point.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function add_points() {

    global $current_user;
    global $wpdb;
    global $post;

    // On verifie un membre poste un commentaire
    if( $current_user ) {

	// On recupere le nombre de points actuels
	$points = intval(get_user_meta( $current_user->ID, 'Points', true));

	// On verifie si le membre a deja poste un commentaire
	$comment_user_count = (int) $wpdb->get_var(
			$wpdb->prepare("SELECT COUNT(*) FROM $wpdb->comments
			WHERE comment_post_ID = %d
			    AND user_id = %d
			    AND comment_approved = '1'", $post->ID, $current_user->ID)
		);
	// On est le premier commentaire, on met a jour les points
	if( $comment_user_count == 1 ) {

		$points += 5;
		update_user_meta($current_user->ID, 'Points', $points);
	}

    }
}
add_action('comment_post', 'add_points');

[/pastacode]
Le nombre de point actuel est récupéré à l’aide de la fonction get_user_meta(). Il est important de passer la valeur dans la variable intval ! Par défaut, get_user_meta renvoie une variable de type string et non pas de type integer. Si vous ne faîtes pas la modification, le nombre de point ne pourra pas être mis à jour.

Comme j’ai précisé en début du tutoriel, le hook comment_post établi une action après avoir posté le commentaire dans la base de données. C’est pour cette raison que nous vérifions si $comment_user_count est égale à 1 et pas à 0 !

La mise à jour du nombre est faite grâce à la fonction update_user_meta().

A partir de maintenant, chacun de vos membres remporteront 5 points pour le premier commentaire posté sur un article.

Ajout ou retrait des points en fonction du statut

Via l’espace d’administration, un administrateur peut approuver, désapprouver ou supprimer un commentaire. Le hook wp_set_comment_status réalisera un appel de notre fonction retour lorsqu’un commentaire change de statut.

La fonction d’appel doit contenir la variable $comment_id et $comment_status qui correspondent à l’id et le statut du commentaire courant.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function update_points_comment_by_status($comment_id, $comment_status) {
    global $current_user;
    global $wpdb;
    global $post;
}
add_action('wp_set_comment_status', 'update_points_comment_by_status', 10, 2);

[/pastacode]
La première vérification consiste à savoir si la personne a les droits de modification sur un commentaire. La fonction current_user_can et la permission unique aux administrateurs manage_option seront nécessaires pour la vérification.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function update_points_comment_by_status($comment_id, $comment_status) {

   global $current_user;
   global $wpdb;
   global $post;

   // On verifie si le membre a les droits pour approuver un commentaire
   if( current_user_can('manage_options') ) {
   }
}
add_action('wp_set_comment_status', 'update_points_comment_by_status', 10, 2);

[/pastacode]
Après avoir vérifier les droits, on cherche à savoir si le commentaire est posté par un membre.
La vérification se fait à l’aide d’une simple requête SQL.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function update_points_comment_by_status($comment_id, $comment_status)  {

    global $current_user;
    global $wpdb;
    global $post;

    // On verifie si le membre a les droits pour approuver un commentaire
    if( current_user_can('manage_options') ) {

	$comment_user = (int) $wpdb->get_var(
		$wpdb->prepare("SELECT user_id FROM $wpdb->comments
				WHERE comment_ID = %d", $comment_id)
	);

	if( $comment_user->user_id >= 1 ) {
	}
    }
}
add_action('wp_set_comment_status', 'update_points_comment_by_status', 10, 2);

[/pastacode]
Une fois qu’on a récupéré l’id du membre, on va switcher la valeur de la variable $comment_status qui contient le nouveau statut du commentaire.
$comment_status peut avoir 3 valeurs : approve, hold et trash.

Grâce à l’id du membre, on en profite pour récupérer son nombre de points actuels.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function update_points_comment_by_status($comment_id, $comment_status) {

    global $current_user;
    global $wpdb;
    global $post;

    // On verifie si le membre a les droits pour approuver un commentaire
    if( current_user_can('manage_options') ) {

	$comment_user = (int) $wpdb->get_var(
		$wpdb->prepare("SELECT user_id FROM $wpdb->comments
				WHERE comment_ID = %d", $comment_id)
	);

	if( $comment_user->user_id >= 1 ) {

	    // On recupere le nombre de points actuels
	    $points = intval(get_user_meta( $comment_user->user_id, 'Points', true));

            switch( $comment_status ) {

		case 'approve' :		

		    break;

		case 'hold' :

		    break;

		case 'trash' :

		    break;
	    }

	}
    }
}
add_action('wp_set_comment_status', 'update_points_comment_by_status', 10, 2);

[/pastacode]
Si le statut vaut approve, on ajoute les points au membre si c’est le premier commentaire qu’il ajoute sur l’article.

Si le statut vaut hold, le commentaire est désapprouver par l’administrateur et on retire par conséquent 5 points.

Enfin, si le statut vaut trash, cela signifie que l’administrateur a supprimé le commentaire. Dans ce cas, on sanctionne le membre d’une pénalité de 50 points !
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function update_points_comment_by_status($comment_id, $comment_status) {

    global $current_user;
    global $wpdb;
    global $post;

    // On verifie si le membre a les droits pour approuver un commentaire
    if( current_user_can('manage_options') ) {

	// On recupere les id du membre et du post concerné par un ajout de commentaire
	$comment_user = $wpdb->get_row(
		$wpdb->prepare("SELECT user_id, comment_post_ID FROM $wpdb->comments 
                                WHERE comment_ID = %d", $comment_id)
	);

	if( $comment_user->user_id >= 1 ) {

	    // Si on a bien un membre, on verifie si le commentaire est le premier pour cet article
	    $comment_user_count = (int) $wpdb->get_row(
			$wpdb->prepare("SELECT COUNT(comment_post_ID) FROM $wpdb->comments 
                                        WHERE comment_post_ID = %d
					    AND user_id = %d
                                        GROUP BY comment_post_ID", $comment_user->comment_post_ID, $comment_user->user_id)
            );

	    // On recupere le nombre de points actuels
	    $points = intval(get_user_meta( $comment_user->user_id, 'Points', true));

	    switch( $comment_status ) {

	        case 'approve' :		

		    // Si on est sur le premier commentaire, on met a jour les points selon le statut
		    if( $comment_user_count == 1 ) {

		        $points += 5;
			update_user_meta($comment_user->user_id, 'Points', $points);
		    }

		    break;

		case 'hold' :

		    $points += -5;
		    update_user_meta($comment_user->user_id, 'Points', $points);

		    break;

		case 'trash' :

		    $points += -50;
		    update_user_meta($comment_user->user_id, 'Points', $points);

		    break;
	     }
        }
    }
}
add_action('wp_set_comment_status', 'update_points_comment_by_status', 10, 2);

[/pastacode]

Ajout des points après annulation de la corbeille

Si par erreur vous mettez un commentaire dans la corbeille, votre membre sera sanctionné d’une pénalité de 50 points ! Heureusement, grâce au hook untrash_comment, on pourra rajouter les points si on enlève le commentaire de la corbeille.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]

function update_points_untrash_comment( $comment_id ) {

    global $current_user;
    global $wpdb;

    // On verifie si le membre a le droit d'approuver un commentaire
    if( current_user_can('manage_options') ) {

        // On recupere id du membre
	$comment_user_id = $wpdb->get_var(
		$wpdb->prepare("SELECT user_id FROM $wpdb->comments 
                                WHERE comment_ID = %d", $comment_id)
	);

	// On recupere le nombre de points actuels
	$points = intval(get_user_meta( $comment_user_id, 'Points', true));

	if( $comment_user_id >= 1 ) {

	    $points += 50;
	    update_user_meta($comment_user_id, 'Points', $points);
	}
    }
}
add_action('untrash_comment','update_points_untrash_comment');

[/pastacode]

Cet article a été mis à jour il y a 4718 jours - Il n'est peut être plus à jour !

Article écrit par Jonathan B.

Jonathan est le co-fondateur de WP Media, startup connue pour être l’auteur de WP Rocket et Imagify. Il est aussi co-organisateur du WordCamp Lyon et Paris.

9 Commentaires

  1. Sympa l’astuce !
    Je me demande s’il est possible créer un système de point par rapport au contenu de l’article.

    Exemple :

    +1 Pour un bon titre
    +9 pour une bonne url
    +100 Pour un paragraphe d’introduction
    +200 Pour l’ajout d’un nouveau bloc texte + image
    +300 s’il y a plus de 5 commentaires
    etc.

    Ça serai pas mal !
    Tu as une idée ? :)

  2. @Valentin : Oui c’est possible, il faut capter les différentes valeurs envoyées par le formulaire et puis tu fais ta série de tests pour incrémenter le nombre de points en fonction de ce que tu as énuméré.

  3. Merci beaucoup pour ce tutoriel assez sympathique !
    J’aurais juste une question : comment peut-on afficher le nombre de points d’un utilisateur sur une page auteur (ou sur n’importe quelle page) ?

    J’ai essayé ceci :

    ID, ‘Points’, true); ?>

    Mais hélas cela ne m’affiche rien. Une idée ?

    Merci d’avance !

  4. Hm, la balise code n’a pas fonctionné…

    J’essaie avec le bouton “php” du formulaire de commentaire.

    ID, ‘Points’, true); ?>

  5. Non, le code n’est pas possible sauf si c’est prévu et ça a l’air pourtant prévu :-)
    En fait, ça ressemble beaucoup à ce que fait le plugin Cubepoints mais je serai curieux de savoir s’il est possible de dépenser ses points pour voir un contenu…

  6. Bonjour tout le monde,

    En effet, cette fonctionnalité est très intéressante ! Cependant, le script ne semble guère fonctionner correctement. En insérant ceci dans les informations du membre visible sur les commentaires :
    printf(__($points . ‘ points de participation.’ ))
    Le tout entre balises PHP (bien sûr !) l’incrémentation ne semble pas se faire. En effet, à chaque commentaire de mes membres “test” le résultat reste toujours à 0.

    Quelqu’un aurait réussi à faire tourner ce script ?

    Merci pour vos réactions !