Articles connexes, par pertinences, avec {mots}

Ceci est une « contribution pédagogique », qui montre par l’exemple comment développer une nouvelle fonctionnalité pour SPIP.

Cet article est une mise à jour de Afficher les articles connexes, triés par pertinence, en proposant d’utiliser les nouveaux outils de SPIP, et notamment la version 2.1 (sous SPIP 3) ou 1.3 (sous SPIP 2 et 2.1) du plugin Critère mots.

Problèmatique

Le problème est simple : trouver les articles ayant des mots-clef communs avec l’article de la page courante, en les triant en fonction du nombre de mots-clef communs.

Exemple

  • L’article de la page courante est associé aux mots 2,3,4.
  • L’article x est associé aux mots 3,4
  • L’article y est associé aux mots 1,4.

Nous souhaitons afficher les articles x et y, triés dans cet ordre, car :

  • x a deux mots-clef communs avec l’article principal.
  • y a un mot-clef commun avec l’article principal.

Mise en œuvre

Contrairement au précédent article, pas de PHP à manipuler. En revanche, on utilisera le plugin Critère mots.

Commençons par remplir un tableau #GET avec la liste des mots-clefs associés à l’article courant.

#SET{mots,#ARRAY}
<BOUCLE_mot(MOTS){id_article}>
	#SET{mots,#GET{mots}|push{#ID_MOT}}
</BOUCLE_mot>

On consultera la documentation de #ARRAY pour plus de détails.

Créons maintenant la boucle des articles connexes :

<B_connexes>
Articles connexes :
<ul>
<BOUCLE_connexes(ARTICLES){id_article!=#ID_ARTICLE}{mots 1 #GET{mots} !tri}{0,5}>
   <li>#TITRE</li>
</BOUCLE_connexes>
</ul>
</B_connexes>

Commentaire des différents critères :

  • {id_article!=#ID_ARTICLE} : nous ne voulons pas reprendre l’article principal.
  • {mots 1 #GET{mots} !tri} : nous souhaitons :
    • récupérer les articles avec au moins 1 mot dans le tableau #GET{mots},
    • trier en fonction du nombre de mots qui :
      • sont associés à chaque article ;
      • sont présents dans #GET{mots}.
    • en mettant d’abord les articles avec le plus de mots associés (!tri).
  • {0,5} : nous limitons à 5 articles connexes seulement.

Et voilà !

Discussion

2 discussions

  • 4
    Thiébaut

    Sur SPIP 3.0.10, la version 2.1 du plugin fonctionne très bien pour les articles. Cela exige bien-sûr une gestion des mots-clés méthodique, mais du coup, on peut se passer du système de rubrique avec une pertinence accrue.

    Par contre, je n’ai pas réussi à l’utiliser pour lister tous les auteurs connexes dans la page auteur. Pour le test, j’ai associé un mot-clé commun à deux auteurs (dont celui de la page test) et j’ai adapté la boucle comme ceci :

    [(#REM) Auteurs connexes ]
    #SET{mots,#ARRAY} 
    <BOUCLE_motsconnexes(MOTS){id_auteur}> 
    #SET{mots,#GET{mots}|push{#ID_MOT}} 
    </BOUCLE_motsconnexes>
    <B_auteursconnexes>
    <div class="menu">
    <h2>Auteurs connexes</h2>
    <ul> 
    <BOUCLE_auteursconnexes(AUTEURS){id_auteur!=#ID_AUTEUR}{mots 1 #GET{mots}!tri}{0,10}> 
    <li><a href="#URL_ARTICLE">#TITRE</a></li> 
    </BOUCLE_auteursconnexes> 
    </ul>
    </div>
    </B_auteursconnexes>
    </code>

    Aurais-je fait une erreur dans mes boucles ?

    • il y avait deux bugs au niveau du plugin :
      -  1 lié au fait que les auteurs peuvent eux même être reliés à des objets, ce qui donnait une clause ambiguë dans le requête sql (http://zone.spip.org/trac/spip-zone/changeset/74474).
      -  1 lié au fait que je conditionnais le calcul de la boucle à la présence d’au moins 2 éléments dans le tableau, et non pas d’1 élèment (http://zone.spip.org/trac/spip-zone/changeset/74476).

      La version 2.1.3 devrait résoudre ce pb. Le zip sera normalement prêt d’ici 13h10, et a priori à 18h et quelques via le chargeur auto de SPIP.

    • par ailleurs :
      -  tu devrais (pour plus de lisibilité) mettre une espace avant le !
      -  il faut corriger la ligne 11 :

      <a href="#URL_AUTEUR">#NOM</a>

      .

    • Thiébaut

      Merci, j’attends la nouvelle version pour le retour !

    • Thiébaut

      Tout est arrangé, bravo ! J’ai même réussi à faire une boucle d’images connexes. Ce plugin permet vraiment d’exploiter au mieux les mots-clés. Merci !

    Répondre à ce message

  • 2
    Thiébaut

    Je reposte, toujours concernant l’utilisation des mots connexes dans la page auteur... mais pour proposer une boucle avec anti-doublons que je viens de tester avec succès.

    Cette fois-ci, à défaut de réussir à afficher les autres auteurs par mots connexes d’auteur, on affichera les autres auteurs par mots connexes d’articles. On reprendra donc dans un tableau tous les mots-clés associé aux articles de notre auteur test, puis on cherchera tous les articles du site qui ont les mêmes mots-clé et on affichera leurs auteurs (l’anti-doublon n’est là que pour pouvoir trier la liste obtenue comme on veut).

    [(#REM) Auteurs dont les articles sont connexes ]			
    #SET{mots,#ARRAY}
    <BOUCLE_articlesauteur(ARTICLES){id_auteur}>
    <BOUCLE_motsconnexes(MOTS){id_article}> 
    #SET{mots,#GET{mots}|push{#ID_MOT}} 
    </BOUCLE_motsconnexes>
    </BOUCLE_articlesauteur>
    <BOUCLE_articlesconnexes(ARTICLES){id_article!=#ID_ARTICLE}{mots 1 #GET{mots}!tri}>
    <BOUCLE_auteurconnexes(AUTEURS){id_article}{doublons auteurs}></BOUCLE_auteurconnexes>
    </BOUCLE_articlesconnexes>	
    <B_tt_auteurconnexes>
    <div class="menu">
    <h2>Auteurs dont les articles sont connexes</h2>
    <ul> 
    <BOUCLE_tt_auteurconnexes(AUTEURS){!doublons auteurs}{par nom}>
    <li><a href="#URL_AUTEUR" [ class="(#EXPOSE)"]>#NOM</a></li>
    </BOUCLE_tt_auteurconnexes>		 
    </ul>
    </div>
    </B_tt_auteurconnexes>

    Il y a sûrement des trucs à revoir, mais ça a l’air de fonctionner...

    • Thiébaut

      Ligne 8, le {id_article!=#ID_ARTICLE} est un oubli de copié-collé. Il ne sert strictement à rien dans ce cas ! Mais il n’empêche pas la boucle de fonctionner.

    • Thiébaut

      Par contre, ligne 9 (Boucle des auteurs connexes) on peut ajouter un {!id_auteur=#ID_AUTEUR} pour éviter d’afficher l’auteur de la page en cours, ce qui au final donne (avec l’ancre pagination)

      [(#REM) Auteurs dont les articles sont connexes ]			
      #SET{mots,#ARRAY}
      <BOUCLE_articlesauteur(ARTICLES){id_auteur}>
      <BOUCLE_motsconnexes(MOTS){id_article}> 
      #SET{mots,#GET{mots}|push{#ID_MOT}} 
      </BOUCLE_motsconnexes>
      </BOUCLE_articlesauteur>
      <BOUCLE_articlesconnexes(ARTICLES){mots 1 #GET{mots}!tri}>
      <BOUCLE_auteurconnexes(AUTEURS){!id_auteur=#ID_AUTEUR}{id_article}{doublons auteurs}></BOUCLE_auteurconnexes>
      </BOUCLE_articlesconnexes>	
      <B_tt_auteurconnexes>
      <div class="menu">
      #ANCRE_PAGINATION
      <h2><:auteursconnexes:></h2>
      <ul> 
      <BOUCLE_tt_auteurconnexes(AUTEURS){!doublons auteurs}{!doublons auteurs}{par nom}{pagination 10}>
      <li><a href="#URL_AUTEUR" [ class="(#EXPOSE)"]>#NOM</a></li>
      </BOUCLE_tt_auteurconnexes>		 
      </ul>
      [<p class="pagination">(#PAGINATION)</p>]
      </div>
      </B_tt_auteurconnexes>

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom

Dernière modification de cette page le 25 juillet 2013