Commentaires hybrides publiques/cachés sous WordPress
Il y a quelques temps, j’ai mis au point un système de commentaires hybride sur mon blog WordPress : à savoir des commentaires publics et des commentaires réservés aux internautes inscrits sur le blog (plus d’infos dans cet article). Je vous propose de revenir ci-dessous sur la manière dont je m’y suis pris techniquement…
Mise à jour du 30/04/2016 – Cette fonctionnalité a été supprimée de mon blog. Je laisse néanmoins cet article pour mémoire…
En préambule, je tiens à préciser que cet article expose le principe de la solution, mais n’est pas un tutoriel, et encore moins un pas-à-pas. Il est compréhensible par toute personne ayant un petit peu de connaissance en WordPress, mais si vous recherchez un plugin clef-en-main, passez votre chemin.
Prérequis
Afin de réserver certains des commentaires de votre blog à un cercle restreint d’internautes, il est necessaire que ces internautes soient idenfiés. Pour cela, nous utilisons le concept « d’utilisateurs » proposé en natif par wordpress. Pour être reconnus, vos internautes doivent être inscrits et identifiés sur votre blog.
Pour vous faciliter la vie, je vous propose deux plugins :
Pie Register permet de gérer les inscriptions. Il propose une page dédiée où n’importe quel internaute pourra demander une inscription sur votre blog, et propose différentes possibilités de configurations, comme un captcha ou une confirmation par email, suivant vos besoins.
Login with Ajax permet d’inclure dans votre sidebar (en haut à droite, pour moi) une possibilité de s’identifier directement, sans avoir à changer de page. Très pratique ! Quoique dans notre cas, il sera préférable de configurer le plugin afin qu’il recharge la page dans sa totalité après s’être logué (histoire d’afficher les fameux commentaires cachés) plutôt que de se loguer uniquement en ajax.
Problématique
Le probléme de départ est le suivant : comment implémenter un système de commentaires hybride ? Le principe serait que chaque internaute reste libre de poster et consulter les commentaires publics, mais seuls les internautes reconnus par le blog peuvent poster et consulter les commentaires cachés (je préfère la dénomination « caché » à « privé », qui peut avoir un autre sens pour WordPress ; un commentaire caché doit donc avoir deux comportements possibles : affiché ou dissimulé).
Plus prosaïquement, voici le cahier des charges :
- Conserver le comportement actuel des commentaires (n’importe quel internaute peut laisser un commentaire, et lire les commentaires précédents) ;
- Un nouveau type de commentaire (les « commentaires cachés ») est à définir, ceux-ci ne doivent jamais pouvoir être lu par un internaute inconnu ;
- Toutefois, n’importe quel internaute doit pouvoir savoir qu’un ou plusieurs commentaires cachés ont été laissés ;
- Un internaute reconnus par le blog doit pouvoir laisser, au choix, un commentaire normal ou caché.
Exemples
Solution
La solution passe donc par la définition d’un nouveau type de commentaire. Suivant si l’internaute est reconnu par le blog, ces commentaires seront ensuite affichés (ou pas).
Plutôt que de définir un type de commentaire entièrement nouveau dans la base de donnée de WordPress, nous utilisons la table native des commentaires à laquelle nous ajoutons un nouvel attribut, indiquant si le commentaire est de type « standard » ou « caché » (dans le code, nous utilisons le terme « shadow » plutôt que « hidden », ce dernier terme pouvant avoir plusieurs sens, lui aussi). Pour cela, nous utilisons la requète MySQL suivante :
[sql]ALTER TABLE `wp_comments` ADD `comment_shadow` BOOLEAN NOT NULL DEFAULT ‘0’[/sql]
Utilisation & gestion des commentaires cachés
Il faut ensuite proposer à l’internaute un bouton permettant de soumettre un commentaire caché. Toutefois, ce bouton n’apparait que si l’internaute est bien reconnu par le blog. Pour cela, nous ajoutons un bouton submit dans le « comments.php » du thème WordPress :
[html]<?php if (is_user_logged_in()) { ?> <input name="submit_shadow" class="button_shadow" type="submit" id="submit_shadow" tabindex="5" value="Poster le Commentaire en privé" /> <?php } ?>[/html]
Une fois le commentaire validé par l’internaute, WordPress doit pouvoir identifier le type du commentaire (normal ou caché). C’est la fonction de ce code à insérer dans « /wp-comments-post.php », $comment_shadow est un booléen qui renseigne sur le type de commentaire (true = caché, false = normal (par défaut)) :
[php]// Ajout Ekho : récupération de shadow
if (isset($_POST[‘submit_shadow’])) {
$comment_shadow = true;
} else {
$comment_shadow = false;
}
$commentdata = compact(‘comment_post_ID’, ‘comment_author’, ‘comment_author_email’, ‘comment_author_url’, ‘comment_content’, ‘comment_type’, ‘comment_parent’, ‘user_ID’, ‘comment_shadow’);
$comment_id = wp_new_comment( $commentdata );[/php]
Enfin, lors de l’enregistrement du commentaire dans la base de donnée, il faut renseigner son type dans le nouvel attribut créé à cet effet. Cela est réalisé via le code ci-dessous à insérer dans « /wp-include/comment.php » (fonction « wp_insert_comment »), qui se contente de répercuter la valeur booléenne précédente :
[php]$data = compact(‘comment_post_ID’, ‘comment_author’, ‘comment_author_email’, ‘comment_author_url’, ‘comment_author_IP’, ‘comment_date’, ‘comment_date_gmt’, ‘comment_content’, ‘comment_karma’, ‘comment_approved’, ‘comment_agent’, ‘comment_type’, ‘comment_parent’, ‘user_id’,’comment_shadow’);[/php]
A ce stade, pour récapituler, WordPress est capable de proposer le bouton d’envoi d’un commentaire caché si l’internaute est identifié sur le blog, puis de reconnaitre le commentaire comme tel et de l’enregistrer dans la base de données.
Affichage des commentaires cachés
Reste à gérer l’affichage (ou pas) des commentaires. L’affichage sera bien sûr à adapter à votre convenance et au thème que vous utilisez, mais voici le code employé dans la boucle d’affichage des commentaires « comments.php » de mon thème :
[php]<?php if($comment->comment_shadow == 1){ ?>
<li <?php echo $oddcomment; ?>id="comment-<?php comment_ID() ?>" class="comment-shadow">
<?php if (is_user_logged_in()) { ?>
<small class="commentmetadata-shadow"><cite><?php comment_author_link() ?></cite>, le <a href="#comment-<?php comment_ID() ?>" title=""><?php comment_date(‘j F Y’) ?>, à <?php comment_time() ?></a><?php edit_comment_link(‘(editer)’,’ ’, »); ?></small>
<?php if ($comment->comment_approved == ‘0’) : ?>
<em>Votre commentaire est en attente de modération.</em>
<?php endif; ?>
<?php
echo "<div style=’float: right; margin-left: 10px;’>";
echo get_avatar( $comment->comment_author_email, $size = ’50’, $default = ‘http://www.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=50’ );
echo "</div>";
?>
<?php comment_text() ?>
<?php } else { ?>
<?php comment_author_link() ?> a rédigé un commentaire privé le <a href="#comment-<?php comment_ID() ?>" title=""><?php comment_date(‘j F Y’) ?>, à <?php comment_time() ?></a>. En savoir plus…
<?php } ?>
<?php } else { ?>
<?php if([censuré]){
$class_meta = ‘commentmetadata-author’;
$class_backgr = ‘comment-author’;
}else{
$class_meta = ‘commentmetadata’;
$class_backgr = ‘comment-standard’;
}
?>
<li <?php echo $oddcomment; ?>id="comment-<?php comment_ID() ?>" class="<?=$class_backgr?>">
<small class="<?=$class_meta?>"><cite><?php comment_author_link() ?></cite>, le <a href="#comment-<?php comment_ID() ?>" title=""><?php comment_date(‘j F Y’) ?>, à <?php comment_time() ?></a><?php edit_comment_link(‘(editer)’,’ ’, »); ?></small>
<?php if ($comment->comment_approved == ‘0’) : ?>
<em>Votre commentaire est en attente de modération.</em>
<?php endif; ?>
<?php
echo "<div style=’float: right; margin-left: 10px;’>";
echo get_avatar( $comment->comment_author_email, $size = ’50’, $default = ‘http://www.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=50’ );
echo "</div>";
?>
<?php comment_text() ?>
<?php } ?>[/php]
Son principe est assez simple. Pour chaque commentaire :
- S’il est caché :
- Et si l’internaute est reconnue : afficher le commentaire ;
- Et si l’internaute n’est pas reconnu : afficher seulement le nom de l’auteur du commentaire caché, ainsi que sa date ;
- S’il est normal :
- Et si l’auteur du commentaire est l’auteur du blog : afficher le commentaire avec une classe CSS spéciale ;
- Et sinon: afficher le commentaire.
Utilisez ensuite un code CSS pour différencier les comentaires cachés, les comentaires normaux et/ou les lignes indiquant seulement la présence d’un commentaire caché (à quoi j’ajoute personnellement un affichage différent pour les commentaires de l’auteur du blog, mais là n’est pas le sujet). Idem si vous souhaitez différencier le bouton d’envoi d’un commentaire caché. A titre d’exemple, voici le miens :
[css].commentlist li.comment-shadow {
margin: 15px 0 3px;
padding: 8px 15px 10px 15px;
background:#ece5ec;
border-top: 1px solid #e3cfe3;
}
.commentmetadata-shadow {
display: block;
background:#e3cfe3
}
.button_shadow {
color:#723571;
}[/css]
Pièges !
Attention, jusqu’à présent, nous ne nous sommes interessés qu’à la dissimulation des commentaires cachés dans l’affichage d’un article sur le blog. Il existe toutefois différents endroits où le contenu des commentaires est susceptible d’être affiché par WordPress, sans tenir compte de nos modifications précédentes.
Par exemple, dans les flux, WordPress indique le contenu complet de chaque commentaire posté sur le blog. Pour éviter cela, voici comment j’ai procédé…
Partant du principe que les flux ATOM sont très peu utilisés, j’empèche simplement l’affichage du contenu de tous les commentaires dans le corps du flux (sans pour autant empécher la publication de la présence de nouveaux commentaires). Pour cela, dans « /wp-include/feed-atom-comments.php », supprimer la ligne :
[html]<content type="html" xml:base="<?php comment_link(); ?>"><![CDATA[<?php comment_text(); ?>]]></content>[/html]
Dans le cas des flux RSS, je souhaite que si un commentaire est de type normal, il soit affiché ; toutefois, s’il est caché, il ne doit pas apparaitre (il n’apparaitra que sur le blog, pour des internautes identifiés, rappelons-le). Dans « /wp-include/feed-rss2-comments.php », modifier la ligne :
[html]<?php if($comment->comment_shadow == 1){ ?>
<description>*** Ce commentaire est privé et ne s’affiche pas dans le flux RSS. ***</description>
<content:encoded><![CDATA[*** Ce commentaire est privé et ne s’affiche pas dans le flux RSS. ***]]></content:encoded>
<?php } else { ?>
<description><?php comment_text_rss() ?></description>
<content:encoded><![CDATA[<?php comment_text() ?>]]></content:encoded>
<?php } ?>[/html]
Méfiez-vous aussi des plugins que vous pouvez utiliser, et qui sont susceptibles de publier le contenu des commentaires. Sur Ekhorizon, j’en utilisez deux : l’un pour afficher les derniers commentaires (barre latérale de droite), l’autre pour signaler de nouveaux commentaires par email, si un internautes souhaite s’inscrire à de telles alertes pour chaque article. Du coup, il vous faudra mettre les mains dans la configuration de ces plugins, voire dans le code lui-même pour assurer une non-visibilité à vos comentaires cachés.
Voili voilou. Des questions ?
Et par la même occasion perdre l’option « mise à jour » du wordpress, des plugins et des thèmes ?
N’y a-t-il pas moyen de le faire via un plugin … Qui, en « gros », sauvegarderait le message « %Pas le droit de me lire% » et qui enregistrerait le contenu posté dans un autre champ de la BDD.
En gros ajouter deux champs (un pour le fun, l’autre pour la forme) :
– shadow, boolean, vaut 1 si c’est un commentaire caché (inutile)
– shadow_content, NULL si c’est un commentaire « normal », contient le message sinon.
Ai-je été clair ? Pas sûr 🙁
Il n’a pas tord le monsieur. En bidouillant comme ça le code de wordpress, tu t’empêches de profiter des mises à jour car cela écraserait toutes tes modifications.
oui, mais bon, c’est une bidouille à la Arnaud, hein XD
« 71 requètes. 2, 059 secondes. » Je suis le seul à penser que c’est énorme ? :O
Ah, oui, je troll 😡
En fait il fait un tuto alors qu’un plugin en un fichier php pourrait faire pareil et lui éviter des bricoles :p
Oui, je vois très bien ce que tu veux dire, PunKeel. Merci de ta réaction au passage.
Je n’ai pas fait de plugin pour une raison très simple : je sais pas faire. Je ne suis absolument pas codeur à la base. Comme indiqué par Lyrgard, je ne fais que de la bidouille. L’objet de l’article (qui affiche dés le départ ne pas être un tutoriel mais une solution « de principe »), c’est juste de partager ce que j’ai bidouillé dans mon coin, ça n’a pas plus de prétention. Accessoirement, ça me permet aussi de garder dans un coin les modifs que j’ai faites, si je veux revenir dessus. Donc, je ne prétend absolument pas (et n’ai pas envie) de faire un plugin hyper-optimisé avec MàJ régulières et SAV 24h/24.
Après, si tu veux tenter un tel plugin, je serai très interessé d’y jeter un oeil !
PunKeel a écrit :
Je ne me rend absolument pas compte… Ca serait quoi la moyenne ? Et qu’est-ce qui génèrerait de tels valeurs ? Excès de plugins en tous genres ?
@ PunKeel:
Rho mais il m’énerve, lui ! 😀
Bien vu, merci, j’ai rectifié (mais je t’ai laissé le joli style bleu).
@ Ekho:
Owi je suis bleu <3
Si je t'énerve, j'en suis désolé.
Mais qu’est-ce que c’est amusant d’embêter les autres 😀Héhé 🙂@ Ekho:
Je trouve que 71 requêtes c’est énorme, je croyais que WordPress mettait en cache les requêtes SQL … M’enfin, c’est bien optimisé.
Après, je ne me suis pas plus penché non plus sur les plugins WordPress, mais ça semble plus facile que Joomla!, qui veut des fichiers partout … Pour ne rien faire de plus.
+ C’est cool d’avoir mis le code source entier, maintenant on sait que si en mail on met [censuré], on aura un style différent \o/
🙂
Pourquoi ne pas avoir créer un thème enfant, ainsi on peut faire les mises à jour,
garder une ancien version de WordPress ou toute autre CMS augmente le risque de se faire pirater.
Un pirate va connaitre les failles des anciennes versions, pas de la dernière version.
il fallait créer un espace membre pour rendre les commentaires invisibles au non inscrits
http://4h18.com/plugins-espace-membre/
Salutation Darknote,
Tout d’abord, bienvenue ! Est-ce que nous nous connaissons ?
Il y a deux aspects dans ton commentaire. Pour y répondre :
Je n’ai pas fait un thème car la gestion de 2 types de commentaires ne se fait pas au niveau de l’affichage (thèmes). Il s’ agit ici de toucher à la structure de la base de donnée de wordpress.
Je n’ai pas utilisé de plugin existant car, après recherche, aucun ne correspond au cahier des charges exposé dans cet article.
Après, comme dit dans les commentaires plus haut, j’ai bien conscience que la solution est un bidouillage bien fragile. Mais ça fonctionne bien et ça répond à mon besoin. 🙂 Pour être plus propre, il serait sans doute possible de transformer mon bricolage en plugin sérieux, mais je n’ai ni le temps ni les connaissances nécessaires.
Pour info, je viens de mettre à jour WordPress, et en suivant bêtement les étapes de mon article (trois fichiers à modifier par copier/coller, 30s chrono), je conserve mon système de commentaires cachés sans soucis.
J’ai mis à jour WordPress de la version 3.6 à 4.5.1 aujourd’hui.
Et je dois reconnaitre que c’est finalement assez lourd à maintenir d’un update à l’autre. Comme par ailleurs cette fonctionnalité n’a finalement jamais été utilisée sur mon blog, je la retire donc. Je laisse néanmoins cet article pour le souvenir, et pour éventuellement servir d’inspiration si d’autres internautes sont interessés par ce type de fonctionnalité.
Pour revenir en arrière, il suffit de réaliser les modifications inverses à celles décrites dans cet article (si la mise à jour n’a pas déjà écrasé les fichiers concernés).
Niveau base de donnée, utilisez :
UPDATE `wp_comments` SET `comment_approved` = '0' WHERE comment_shadow = 1
Cela vous permettra de déplacer les commentaires privés dans la zone native « à approuver » de wordpress. A vous de voir ce que vous en ferez (pour ma part, je les ai purement supprimés).
Par la suite, supprimez l’attribut « shadow » avec :
ALTER TABLE `wp_comments` DROP `comment_shadow`;
Et voilà, retour à la case départ !
Pour te donner un retour, à aucun moment je me suis posé la question de laisser un commentaire en public ou non. J’avoue que j’avais même oublié la fonctionnalité (je n’ai même pas souvenir d’un second bouton pour laisser les commentaires en privé, c’est pour dire !!)
Au final, si j’ai quelque chose à dire en privé, je t’envoie un mail, plutôt que de laisser un commentaire privé ici. D’autant plus que n’importe qui peut s’inscrire sur ton blog, non ? Ce qui rend la notion de privé assez floue.
En tout cas, tu as du bien t’amuser à bidouiller ça, et c’est le principal je pense 😉
L’idée, c’était justement d’avoir un peu comme un flux de mails à plusieurs participants, mais consécutif à un article, et potentiellement mêlé à des articles publiques.
Non, la validation est manuelle : je filtre ceux dont je valide l’inscription. En outre, certaines portions d’articles resteront privées. Seuls les commentaires privés sont retirés.
J’avoue, je m’étais bien amusé. 🙂