DotClear : le plugin Billets Connexes complète le plugin Tags
Par Benjamin le jeudi 8 décembre 2005, 00h45 - DotClear - Lien permanent - URL miniature
Non pas que j'oublie le plugin Nombre de Lectures, mais je l'ai mis sur pause pour un temps quand une idée fulgurante m'a traversé l'esprit. Bon d'accord, l'idée n'était pas neuve mais je n'avais jusqu'alors pas la possibilité de la réaliser. Jusqu'au jour où je tombe sur le plugin Tags (se basant lui-même sur le plugin Métadonnées de billet) qui permet d'assigner des mots-clés à chacun des billets.
Présentation
Cette idée qui me trotte dans la tête vient donc de voir le jour : il est désormais possible d'afficher une liste de billets connexes à un billet source. Super ! Oui en effet. Le principe est simple : on récupère les mots-clés du billet source et on les compare à ceux de la base de données à la recherche d'autres billets. Facile, sympa, sexy.
C'est la classe
Oui on peut le dire, c'est de la POO. Mais là n'est pas la question. Point suivant.
En pratique
Le plugin est utilisable dans le fichier post de votre template, mais aussi dans la sidebar ou dans les pages utilisant le plugin Related.
Voici trois exemples d'utilisation de la classe :
geshi php
<?php
/**
pertinence de 2 mots-clés, pas de limite, id auto et clé de tri définie
*/
$bc = new dcBilletsConnexes(2,0,0,'´post_dt´ ASC');
/**
tous les paramètres par défaut
*/
$bc->show();
?>
<?php
/**
pertinence de 1 mot-clé, 5 résultats maximum, id auto et classement par défaut
*/
$bc = new dcBilletsConnexes(1,5);
/**
personnalisation du bloc et du titre, formatage par défaut des éléments de la liste
et séparation des mots-clés avec '/'
*/
$bc->show('<div>%1$s<ul>%2$s</ul></div>',
'<h3>Billet(s) connexe(s)</h3>','*',', ');
?>
<?php
/**
pertinence de 3 mots-clés, pas de limite de résultat, id du billet source spécifié,
classement par défaut
*/
$bc = new dcBilletsConnexes(3,0,53);
/**
bloc et titre par défaut, formatage personnalisé des éléments de la liste
et séparation des mots-clés par défaut
*/
$bc->show('*','*','<li><a href="%2$s" title="Mot(s)-clé(s) : %3$s">%1$s</a></li>');
?>
Explication
Instanciation
Lors de l'instanciation de la classe, il est possible de définir 4 paramètres :
- niveau : nombre qui définit le nombre de mots-clés minimum à avoir en commun avec le billet source
- limite : nombre de résultats maximum à afficher, utile si vous avez 7000 billets connexes
- id : le système est malin, il récupère l'id du billet source tout seul, mais il est aussi possible de lui donner
- ordre : clé de tri des résultats (pour classer les billets par date, par nom et toutes ces choses)
Ces paramètres sont tous optionnels et gardent alors leurs valeurs par défaut qui sont respectivement :
- 1 (un seul mot-clé à avoir en commun, augmenter pour affiner les résultats)
- 0 (mettre zéro pour aucune limite, sinon mettre ce que bon vous semble)
- 0 (par défaut, à zéro donc, l'id est récupéré de façon automatique)
- '`post_dt` DESC' (le classement par défaut est par date, du plus récent ou plus vieux)
Affichage des résultats
La méthode show accepte elle-aussi 4 paramètres :
- bloc : chaîne de formatage du bloc à afficher sur le blog
- titre : titre du bloc (avec gestion intelligente du pluriel)
- item : chaîne de formatage des éléments de la liste
- séparateur : définit le séparateur des tags pour l'affichage
Ces paramètres sont aussi tous optionnels, vous pouvez voir les valeurs par défaut dans l'exemple vu plus haut.
La chaîne bloc reçoit deux valeurs : le titre du bloc et les éléments de la liste :
geshi html4strict <div class="billets-connexes">%1$s<ul>%2$s</ul></div>
La chaîne des éléments de la liste reçoit quant à elle le titre du billet, son url et les mots-clés récupérés :
geshi html4strict <li><a href="%2$s" title="Mot(s)-clé(s) : %3$s">%1$s</a></li>
Gestion des pluriels
Le titre du bloc et la balise title des liens dans les résultats gèrent leur pluriel de façon intelligente. En effet, si vous utilisez "Billet(s) Connexe(s)" ou 'Mot(s)-clé(s)", la classe affichera automatiquement le sigulier ou le pluriel suivant le nombre de résultats. Stupéfiant !
Pour les pluriels complexes, ça marche aussi :
"Voici (une|des) beau(x) soulier(s) pour l'oncle Henri !"
Personnalisation
Si l'envie vous prend de vouloir récupérer les résultats sans affichage, la méthode getinfo est là pour vous.
Ainsi, avec le code suivant :
geshi php <?php $bc = new dcBilletsConnexes(2); $billets = $bc->getinfo(); ?>
On récupère les données sous la forme d'un tableau associatif et on peut alors traiter les infos comme on veut.
L'id des billets est utilisé comme index, le titre, l'url et les tags sont donc utilisables comme ceci :
geshi php
<?php
/**
suite du code vu juste avant donc
*/
foreach ($billets as $id => $billet)
{
echo '<p><a href="'.$billet['url'].'" title="'.$billet['tags'].'">'.$billet['titre'].'</a></p>';
}
?>
Installation
- Pour l'installateur et l'archive, direction le grenier

Commentaires
Pas mal, pas mal
Une fois installé, il n'apparait pas dans la liste des plugins ! Pour info je suis en UTF-8 avec un DotClear 1.2.3
ça c'est diablerie
t'es sûr ?
tu peux essayer l'archive si jamais
Pourtant le dossier est bien là, j'ai vérifié par FTP. Je continuerai à chercher pourquoi ce week-end...
étrange
A tout hasard, le plugin est-il actvé dans le fichier Desc.xml ???
Sinon simpa j'ai testé
J'avais codé un truc qui faisait presque la même chose. Je vais regarder ton plugin pour voir, si je garde mon truc ou si j'adopte le tien.
Ps: petite remarque, est-ce possible avec ton plugin d'avoir une liste des billet proche classée par pertinence decroissante ?
classement en partant de 1 ou du niveau de pertinence choisi ?
(on affiche tous les billets ou juste ceux supérieurs au niveau voulu ?)
ah ok.
J'ai essayé de comprendre comment fonctionne ce greffon et n'y suis pas arrivé (je ne connais pas PHP).
Voici le code que j'ai inséré dans mon post.php
<?php dcBilletsConnexes ?>
Rien n'apparait, mais je ne sais si c'est parce que les billets ne sont pas connexes ou parce que j'ai mal posé le code (je ne penses pas)
Où définit-on la liste des mots-clés? Est-elle générée automatiquement, ou bien est-ce celle des tags?
salut c'est un super plugin ça! Par expérience de 15 jours, je sais que le fait de proposer des articles proches poussent les visiteurs à continuer la visite, ce qui est génial. Je te contacte pour un petit problème, les accents s'affichent mal. Si tu pouvais me donner un indice sur les fichiers à modifier, tu me ferais gagner pas mal de temps, en plus des clicks sur le site
merci en tout cas!
autre question pendant que j'y suis
comment trier l'affichages des billets par ordre du nombre de mots clefs? merci
réponse trouvée pour les accents; j'ai mis une ligne en commentaire dans le fichier functions:
//if (dc_encoding == 'UTF-8') $resultat = utf8_encode($resultat);
sinon je sais pas pourquoi ca marche jamais chez moi l'UTF-8
excellent ! sauf que j'ai le meme probleme d'accent
perso j'ai mis en commentaire la ligne donnée plus haut dans le fichier ecrire\tools\billetsconnexes\functions.php
bizarre mais ça marche!
sinon sympa ton site chrysonline
j'ai mis ta phrase ! rien de change....bon..c'est quand meme embetant cet histoire d'accent : à é è ...
j'essayerai aussi la dessus : www.chrys-online.com
bon ben j'ai toujours le meme pb : allez voir les petits soucis d'accent pour test dans mon list.php de mon blog.
si vous avez la soluce ?
j'ai trouvé : j'ai mis ISO a la place de UTF-8 machin truc...ligne...86
Salut. Excellent ce plugin, mais y-a-t'il moyen de faire afficher les billets connexes également dans la page de liste ? Mes billets y sont affichés dans leur intégralité, donc seuls ceux qui veulent lire/déposer un commentaire ont accés aux billets connexes.
Bon boulot en tout cas.
Ahhum... ok, il devrait être interdit de poster des commentaires aussi tard ! J'ai cru que c'était le plugin qui empéchait l'affichage. Bien sur, la réponse à mon commentaire ci-dessus est d'ajouter la même ligne dans "list.php".

Désolé pour le dérangement
content de t'avoir aidé
J'y comprends rien, chez moi rien ne s'affiche... que je prenne l'exemple sur cette page ou dans dotclear...
tout est bien réglé ? le nombre de mots à comparer tout ça ?
Je tente d'utiliser billets connexes sur une page Related, mais je n'y arrive pas. Rien ne s'affiche. Je comprends pas trop comment sa marche.
tu peux être un peu plus précis ?
quelle page related ? quel code utilisé ?
Salut,
le greffon semble avoir des problèmes avec l’encodage UTF-8… voir ici
pourtant je pensais avoir prévu le coup avec ça :
if (dc_encoding == 'UTF-8') $resultat = utf8_encode($resultat);
la vérité est ailleurs...
tu peux toujours utiliser la méthode getinfo() détaillée au-dessus en attendant
Comme l'a écrit chrysonline plus haut il suffit de changer un truc dans functions.php
Depuis ca marche chez moi :
[quote]Affiche la liste des billets connexes au billet courant
*/
function show($bloc='<div>%1$s<ul>%2$s</ul></div>',$titre='<h2>Billet(s) connexe(s)</h2>',
$s='<li><a href="%2$s" title="Mot(s)-clÈ(s) : %3$s">%1$s</a></li>',$separator=', ')
{
$default = '*';
if ($bloc == $default) $bloc = '<div>%1$s<ul>%2$s</ul></div>';
if ($titre == $default) $titre = '<h2>Billet(s) connexe(s)</h2>';
if ($s == $default) $s = '<li><a href="%2$s" title="Mot(s)-clÈ(s) : %3$s">%1$s</a></li>';
$resultat = $this->__get($s);
if ($nbcount = count($resultat))
{
$titre = $this->__smartplural($titre,$nbcount);
$resultat = implode("", $resultat);
if (dc_encoding == 'ISO') $resultat = utf8_encode($resultat);[/quote]
Salut,
Je voudrais d'abord féliciter et remercier l'auteur du plug-in "billets connexes". Ca marche super bien, l'idée est excellente et apporte un véritable plus au site (contrairement à certain plug-ins). J'ai juste une petite question : quels sont les plug-ins nécessaires pour le fonctionnement de "billets connexes" ? Tags ? Métadonnées ? ou les deux ?
Merci d'avance de m'éclairer et encore bravo.
Steph
bonjour Steph,
pour que le plugin "Billets Connexes" puisse fonctionner, il faut installer les 2 parce que "Billets Connexes" utilise le plugin "Tags" qui lui-même utilise "Métadonnées de billet"
Salut Benjamin,
merci pour les précisions. C'est comme ça que l'avais installé, mais vu que "Tags" et "Métadonnées" ont des fonctionnements assez proches (pour le néophyte que je suis), je voulais clarifier la situation et éventuellement éliminer ce qui n'aurait pas servi.
Salut
Y'aurait-il une façon élégante d'intégrer la liste des billets connexes au flux RSS/Atom du blog ?
avec DotClear 1.2.5 ou 2 ?
Oups pardon, je voulais dire avec Dotclear 1.2.5
Salut,
J'ai commencé à faire quelques essais, mais j'avoue que je sèche un peu sur le sujet d'autant plus que le PHP n'est pas ma spécialité. En plus mes différents appels au secours sont restés sans réponse sur les forums de Dotclear... Je n'ai pas trouvé non plus de documentation sur le flux RSS de Dotclear pour pouvoir avancer sans tout casser... Please...Help...
Ce plug in a l'air bien sympa, mais fonctionne t'il toujours avec les versions plus récentes de dotclear ???
Génial ! Merci pour ce plugin, j'éspère qu'il saura combler mes 70% de visites à 1 page ! ^^
Pour le probleme d'accents, je confirme que changer UTF-8 par ISO dans fonctions.php, ça marche
Merci encore
Merci beaucoup, c'est justement ce que je cherchais... je met cette page en favori et j'essaye en rentrant de vacances
certains prennent de longues vacances.
exelent plugin, ça permet de contextualiser dynamiquement sa page
Benjamin >
Certains reviennent tard sur leurs commentaires !
C'est vrai que le plugin est très bien.
Est-ce que tu aurais des mini-versions pour afficher :
les 3 derniers billets dans la même catégorie
les 3 derniers billets tout court.
Bizarre ton intégration de la mootools... Sur mon FF sous ubuntu, ça marche pas terrible.
Mais chapeau pour le plugin, un des plus utiles que je connaisse !
Hé hé.
Heu... Je sors ?
Je retire ce que j'ai dit SAUF mes compliments.
j'ai beau chercher, je connais bien le fonctionnement de ce plugin que j'utilise depuis longtemps, mais en ce moment j'ai un problème lié à une migration de 1.2.5 à Dc 1.2.7 en iso(utf-8 me donnait des accents).... voila maintenant j'ai cette erreur:
Notice: Undefined variable: bc in C:\wamp\www\dotclear\themes\blog\post.php on line 39
Fatal error: Call to a member function show() on a non-object in C:\wamp\www\dotclear\themes\blog\post.php on line 39
Mon niveau de PHP étant très faible... Et je voulais avoir des billets connexes à mes articles. Une recherche sur google et je tombe sur ton site, j'installe ton plug-in et en 5 minutes ça marche.
Merci beaucoup
Salut,
Je viens d'installer le plugin sur une version 1.2.6. Qu'est-ce que je colle comme code dans le post.php ?
Lorsque je colle ça :
$bc->show('<div>%1$s<ul>%2$s</ul></div>','<h2>Billet(s) connexe(s)</h2>',
'<li><a href="%2$s" title="Mot(s)-clé(s) : %3$s">%1$s</a></li>',', ');
ça ne fonctionne pas
bonjour Cédric,
ça fait un long moment que j' n'ai plus mis les mains dans la première version de DotClear...
tu ne migrerais pas tout doucement vers la version 2 pour laquelle des plugins existent également ?
bien à toi
Salut et merci de ta réponse
Si mon hébergeur était sur une bonne version de PHP, je l'aurai fait.. mais là non.. et migrer ailleurs qq milliers de billets.. c'est chaud.. A priori, le plugin est bien installé, il s'agit uniquement de l'affichage dans le post.. Tags et Métadonnées sont installés... allez allez stppppp
y a-t-il un message d'erreur spécifique ? une erreur PHP ? ça n'affiche rien et c'est tout ?
Bonjour,
Effectivement, rien ne s'affiche, même pas un message d'erreur.. Peut-être que je ne dépose pas la bonne syntaxe.. voici ce que mets dans le post.php : $bc->show('<div>%1$s<ul>%2$s</ul></div>','<h2>Billet(s) connexe(s)</h2>',
'<li><a href="%2$s" title="Mot(s)-clé(s) : %3$s">%1$s</a></li>',', ')
Merci d'avance,
Cédric
N'aurais-tu pas omis de placer ce petit bout de code juste avant ?
$bc = new dcBilletsConnexes(2);Hello
Je n'ai pas oublié de le poser ce bout de code.. je ne savais pas qu'il fallait le poser
, suis naze.. bon un gros merci, je vais remonter dans les posts précédents pour corriger l'affichage des accents, j'ai vu que le problème était posé.. c'est top et très sympa d'avoir pris le temps de répondre.
Cédric
Hello !
Comme l'adresse mail n'est pas rendue publique, tu retrouveras le domaine qui va avec, pour qu'on puisse te rendre la pareille, pub/lien/publi-redac..
Je reviens tout de même avec une "dernière" (j'espère) question..
Actuellement, j'ai l'impression que le plugin fait appel à 2 tags pour fonctionner.. Certains des blogs présents sur le domaine n'utilisent qu'un tag pour le billet .. quelle est la modif que je dois mettre en oeuvre pour que le plugin ne tienne compte que d'un tag ?
Merci d'avance,
Cédric
$bc = new dcBilletsConnexes(1);Ici c'est pareil que chez moi, le plugin marche mais plus de case "se souvenir de moi" quand on laisse un commentaire.
Est-ce le même problème pour tout le monde.