Top commentateurs
Par NiKo le lundi 23 mai 2005, 17:26 - Dotclear - Lien permanent
Toujours aussi inutile, toujours obstinément pas indispensable, une nouvelle fonction maison pour Dotclear : le Top Commentateurs (désolé, ça sonne naze, j'ai pas trouvé mieux; vos suggestions sont les bienvenues).
Cette fonction, comme son nom ne l'indique pas, permet d'afficher la liste des pseudos sous lesquels ont été posté le plus de commentaires sur votre blog. Petit raffinement, on peut lui passer un argument optionnel permettant d'exclure une série de pseudos 
Ajoutez ce code dans votre fichier prepend.php du répertoire de votre thème courant :
/** * @function dcMeilleursCommentateurs v0.2 * * Cette fonction effectue une requete sur la table des commentaires afin * d'en extraire la liste des auteurs les plus prolixes, et de les afficher * ainsi qu'eventuellement un lien vers leur site. * * @param integer $nb Nombre de noms de commentateurs a afficher (default: 5) * @param array $exclure Tableau des pseudos a exclure de la liste (default: empty array) * @param boolean $display_site Affiche ou pas un lien vers le site du commentateur (default: false) * */ function dcMeilleursCommentateurs($nb=5, $exclure=array(), $display_site=false) { GLOBAL $blog; $con = $blog->con; $nb = is_int($nb) && $nb > 0 && $nb <= 100 ? $nb : 5; $reqPlus = ''; if (!is_array($exclure) || count($exclure) == 0) { $do_exclure = false; } else { $do_exclure = true; for ($i=0; $i<count($exclure); $i++) { $reqPlus .= "AND comment_auteur != '".str_replace("'", "\'", $exclure[$i])."'"; } } $sql = 'SELECT DISTINCT(comment_auteur), COUNT(comment_auteur) AS nbposts, MAX(comment_site) AS comment_site FROM dc_comment WHERE 1 '.$reqPlus.' GROUP BY comment_auteur ORDER BY nbposts DESC, comment_site ASC LIMIT 0, ' . $nb; if ($rc = $con->select($sql)) { if ($rc->int_row_count > 0) { $pos = 0; echo '<ol>'; while ($rc->fetch()) { if ($do_exclure == false || !in_array($rc->f('comment_auteur'), $exclure)) { if ($display_site == true && $rc->f('comment_site')) { $auteur = '<a href="http://'.$rc->f('comment_site').'" rel="nofollow">'.$rc->f('comment_auteur').'</a>'; } else { $auteur = $rc->f('comment_auteur'); } echo '<li><strong>'.$auteur.'</strong> ('.$rc->f('nbposts').')</li>'; } } echo '</ol>'; } else { echo '<p>Aucun commentaire.</p>'; } } }
Cela s'utilise comme suit, par exemple dans votre fichier template.php du thème courant :
<?php dcMeilleursCommentateurs(5, array('NiKo', 'Jean-Pierre Rafarin', 'MecQueJ\'AimePas', 'Spammeur-Man'), true) ?>
Le premier paramètre permet de spécifier le nombre de pseudos à afficher (5 par défaut), le deuxième est un tableau contenant les pseudos à exclure de la liste et le troisième spécifie si vous désirez afficher un lien vers le site du commentateur.
Enjoy 
Edit
Suite à la remarque de kNo', voici une altération de la table dc_comment ajoutant un index sur le champs comment_auteur, déstinée à alléger la charge généré par l'execution de la requête utilisée par la fonction :
ALTER TABLE dc_comment ADD INDEX idxauteur ( comment_auteur );
N'étant pas expert absolu en SQL, je demande validation du principe aux sommités parcourant ce billet ![]()
Edit 2
Mise à jour de la fonction en version 0.2, avec un nouveau paramètre qui permet de spécifier si l'on veut afficher un lien vers le site du commentateur. C'est de la bouillie de bidouille SQL, j'ai honte[1], mais ça tient en une seule requête, et je n'en ai pas de trace dans mes slow_queries.
Pour éviter que cette fonction ne se transforme en véritable appel au SPAM de commentaires, j'ai ajouté l'attribut rel="nofollow" aux liens générés, et ce afin de dissuader les éventuels spammeurs.
Notes
[1] D'ailleurs si quelqu'un a quelque chose de plus optimisé, qu'il ne se gêne pas pour le signaler 



















Commentaires
1. Le lundi 23 mai 2005, 19:57 par Yazerty
2. Le lundi 23 mai 2005, 20:02 par Mathieu
3. Le lundi 23 mai 2005, 20:09 par Titus
4. Le lundi 23 mai 2005, 20:43 par kNo'
5. Le lundi 23 mai 2005, 20:45 par kNo'
6. Le lundi 23 mai 2005, 20:45 par kNo'
7. Le lundi 23 mai 2005, 21:00 par NiKo
8. Le lundi 23 mai 2005, 21:17 par hipoo
9. Le lundi 23 mai 2005, 22:09 par Yazerty
10. Le mardi 24 mai 2005, 01:59 par Mathieu
11. Le mardi 24 mai 2005, 01:59 par Mathieu
12. Le mardi 24 mai 2005, 05:08 par katsoura
13. Le mardi 24 mai 2005, 09:41 par UrukHai
14. Le mardi 24 mai 2005, 10:04 par Nico
15. Le mardi 24 mai 2005, 10:52 par Thalion
16. Le mardi 24 mai 2005, 11:54 par PiTiLeZarD
17. Le mardi 24 mai 2005, 11:55 par PiTiLeZarD
18. Le mardi 24 mai 2005, 11:55 par PiTiLeZarD
19. Le mardi 24 mai 2005, 12:06 par NaWer
20. Le mardi 24 mai 2005, 13:46 par w0arz
21. Le mardi 24 mai 2005, 14:03 par NiKo
22. Le mardi 24 mai 2005, 14:15 par mike
23. Le mardi 24 mai 2005, 14:31 par NiKo
24. Le mardi 24 mai 2005, 14:49 par wildmary
25. Le mardi 24 mai 2005, 15:11 par Mathieu
26. Le mardi 24 mai 2005, 15:36 par NiKo
27. Le mardi 24 mai 2005, 15:57 par Mathieu
28. Le mardi 24 mai 2005, 16:12 par wildmary
29. Le mercredi 25 mai 2005, 00:14 par AeN0
30. Le mercredi 25 mai 2005, 09:09 par wildmary
31. Le jeudi 26 mai 2005, 09:47 par Nico
32. Le vendredi 10 juin 2005, 11:54 par ltd
33. Le vendredi 10 juin 2005, 12:01 par NiKo
34. Le vendredi 10 juin 2005, 12:28 par kNo'
35. Le vendredi 10 juin 2005, 12:30 par NiKo
36. Le vendredi 10 juin 2005, 12:42 par NiKo
37. Le vendredi 10 juin 2005, 14:30 par ltd
38. Le vendredi 10 juin 2005, 14:32 par NiKo
39. Le vendredi 10 juin 2005, 17:52 par ltd
40. Le vendredi 10 juin 2005, 18:02 par NiKo
41. Le vendredi 10 juin 2005, 18:07 par ltd
42. Le vendredi 10 juin 2005, 18:24 par ltd
43. Le vendredi 10 juin 2005, 18:27 par NiKo
44. Le vendredi 10 juin 2005, 18:35 par ltd
45. Le vendredi 10 juin 2005, 18:50 par ltd
46. Le dimanche 19 juin 2005, 16:54 par Hugues
47. Le lundi 20 juin 2005, 02:13 par NiKo
48. Le samedi 25 juin 2005, 12:50 par Hugues
49. Le dimanche 3 juillet 2005, 10:09 par Hugues
50. Le dimanche 3 juillet 2005, 10:20 par NiKo
51. Le samedi 14 janvier 2006, 15:01 par Hugues
52. Le samedi 14 janvier 2006, 15:03 par NiKo
53. Le samedi 14 janvier 2006, 16:05 par Hugues