Présentation
Il peut arriver parfois de vouloir sélectionner des objets SPIP (articles, rubriques, sites etc.), ayant un certains nombre de mot clefs communs.
Par exemple, je voudrais sélectionner les articles ayant les mots clefs « fruits » et « desserts », mais pas ceux qui n’ont que « desserts » ou que « fruits ».
Une telle opération, bien que possible, est assez difficile en SPIP ... sauf si vous utilisez ce plugin.
Il s’installe comme n’importe quel plugin.
Il propose trois critères :
- {mots}
- {mots_selon_id}
- {mots_selon_titre}
Dans une boucle, il ne faut utiliser qu’un seul de ces critères.
Le critère {mots}
Prenons un exemple :
<BOUCLE_art(ARTICLES){mots}>
#TITRE
</BOUCLE_art>
Cette boucle sélectionnera les articles ayant tous les mots clefs passés en paramètres d’environnement dans un tableau « mots ».
Comment passer ces mots-clefs en paramètres d’environnement ?
Typiquement, sur une page principale (non incluse), via des paramètres dans l’url. Par exemple : http://www.toto.fr/?page=toto&mots[0]=1&mots[1]=2
.
Ici, j’ai passé dans le tableau ’mots’ les valeurs 1 et 2. Les articles associés, à la fois au mot dont l’id est 1 et à celui dont l’id est 2 seront sélectionnés [1].
Les valeurs du tableau ’mots’ peuvent être des identifiants de mots (1, 2) ou des titres de mots (« fruits », « desserts »).
Attention au cas où des mots clefs sont uniquement sous forme de nombre ...
Le critère {mots_selon_id}
Il fonctionne exactement comme le critère {mots}
, à ceci près que les valeurs du tableau ’mots’ sont forcément des identifiants de mots (1,2).
Le critère {mots_selon_titre}
Il fonctionne exactement comme le critère {mots}
, à ceci près que les valeurs du tableau ’mots’ sont forcément des titres de mots (« fruits »,« desserts »).
Les paramètres supplémentaires
Les trois critères {mots}
,{mots_selon_id}
et {mots_selon_titre}
peuvent prendre trois paramètres : ’score’, ’tableau’, ’tri’. Sous la forme {mots score tableau}
.
Le paramètre ’score’.
Par défaut, le critère {mots}
prend les objets ayant tous les mots passés en paramètre. On peut décider de vouloir prendre ceux ayant au moins un certain nombre de mots passés paramètre, mais pas nécessairement tous. C’est à cela que sert le paramètre ’score’.
- Si score est compris entre 0 et 1 (exclus), alors SPIP sélectionnera les objets ayant au moins ce pourcentage de mots [2] sur le total des mots passés en paramètre. Par exemple si j’écris {mots 0.5}
, et que je passe 10 mots en paramètre, alors SPIP sélectionnera les objets ayant au moins 10*0.5 = 5 des mots passés en paramètre.
- Si score est supérieur ou égale à 1 et suivi du signe « % », alors SPIP sélectionnera les objets ayant au moins ce pourcentage sur le total des mots passés en paramètre. Par exemple si j’écris {mots 50%}
, et que je passe 10 mots en paramètre, alors SPIP sélectionnera les objets ayant au moins 50% de 10 = 5 des mots passés en paramètre.
- Si score est supérieur ou égale à 1, mais n’est pas suivi du signe « % », alors SPIP sélectionnera les objets ayant au moins ’score’ mots passés en paramètres. Par exemple {mots 5}
sélectionnera les objets ayant au moins 5 mots passés en paramètre.
Le paramètre ’tableau’.
Par défaut, SPIP prend comme tableau la variable d’environnement ’mots’. Mais on peut lui dire, via ce paramètre, de prendre un autre tableau.
Ce peut être un tableau :
- calculé via #GET
et #SET
- inscrit en dur via #ARRAY
- passé en variable d’environnement, et appelé via #ENV
.
Ex : {mots 100% #ARRAY{0,2,1,1}}
sélectionnera les objets ayant les mots clefs 2 et 1. Notez qu’il est obligatoire de donner une valeur au paramètre ’score’ pour utiliser ’tableau’, sinon SPIP les confond.
Le paramètre ’tri’
Ce paramètre, existant depuis la version 2.1 (sous SPIP 3) ou 1.3 (sous SPIP 2.1 et 2.0) peut prendre deux valeurs :
- tri
pour trier la boucle en fonction du nombre de mots du tableau associés, en commençant par le plus petit nombre.
- !tri
pour trier la boucle en fonction du nombre de mots du tableau associés, en commençant par le plus grand nombre.
Exemple :
L’article 1 est associé aux mots 1,2,3 ; l’article 2 est associé aux mots 2,3,4,5,6.
{mots 2 #LISTE{1,2,3} !tri}
affichera d’abord l’article 1, puis l’article 2.
En effet, l’article 1 est associé à 3 mots dans la liste (1,2,3), tandis que l’article 2 n’est associé qu’à 2 mots dans la liste (2,3).
Formulaire de sélection
Avec la version 1.1 de ce plugin, une nouvelle possibilité s’offre à vous : faire appel à un formulaire bâtissant pour vous les critères dans l’url pour filtrer selon plusieurs mots clefs.
Connecté en tant que webmestre, vous pouvez tester avec la page de démonstration : /?page=demo/parmots
.
Le formulaire présente dans un premier temps la liste de vos groupes de mots clefs.
Dès que vous en choisissez un dans la liste, automatiquement [3], la liste des mots clefs de ce groupe est affichée juste à côté.
Choisissez un mot clef, et ce dernier et ajouté à l’URL pour ne vous présenter que les articles ayant ce mot clef.
Et le processus peut être répété autant de fois que nécessaire.
Bonus : la liste des mots clefs déjà choisis est affichée sous le formulaire. Chaque mot est cliquable. Un clic le supprime de l’URL et de la liste.
Usage du formulaire
- Sur une seule page
- en affichant tous les groupes de mots :
<div class="ajax"> [(#FORMULAIRE_RECHERCHE_PAR_MOTS)] </div>
- en n’affichant que certains groupes de mots :
#SET{FiltreGroupes,#ARRAY} <BOUCLE_FiltreGroupes(GROUPES_MOTS){titre==^[^_]}> #SET{FiltreGroupes, #GET{FiltreGroupes}|push{#ID_GROUPE}} </BOUCLE_FiltreGroupes> <div class="ajax"> [(#FORMULAIRE_RECHERCHE_PAR_MOTS{#GET{FiltreGroupes}})] </div>
Ici, on a choisi de ne pas afficher les groupes de mots commençants par « _ ».
- On peut aussi utiliser le formulaire sur toute les pages du site pour renvoyer sur une page de résultats :
[(#FORMULAIRE_RECHERCHE_PAR_MOTS{'',#URL_PAGE{pagederesultats}})]
NB :
- le premier paramètre est un tableau d’identifiants de groupes, ou la chaine vide
- le deuxième paramètre est l’URL de la page qui affiche les résultats.
Usage avec le plugin Mots arborescents
Par défaut, seul le mot-clé demandé est recherché.
Mais il est possible de trouver via n’importe quel mot-clé de la branche du mot-clé demandé en mettant dans mes_options.php :
if (!defined('_CRITERE_MOTS_ARBO_BRANCHE'))
define('_CRITERE_MOTS_ARBO_BRANCHE', true);
Discussions par date d’activité
74 discussions
Je viens de tester le cas où on applique plusieurs fois le critère
{mots}
sur la même boucleDans ce cas, seul le dernier critère (
{mots 1 #LISTE{5,6}}
) est pris en compte et les précédents ({mots 1 #LISTE{1,2}}{mots 1 #LISTE{3,4}}
) sont ignorés.Peut-être pourrait-on ajouter un paragraphe pour le préciser.
Répondre à ce message
Bonjour
Je me sers de ce plugin efficace d’ailleurs, pour créer un moteur de recherche multicritères sur plusieurs groupes de mots clés. Je souhaiterai modifier le formulaire de sélection pour faire afficher directement les 4 groupes de mots clé que j’utilise :
- Groupe 1 -> menu déroulant avec les mots clés du groupe
- Groupe 2 -> menu déroulant avec les mots clés du groupe
- Groupe 3 -> menu déroulant avec les mots clés du groupe
- Groupe 4 -> menu déroulant avec les mots clés du groupe
Actuellement il propose d’abord -> Dans le groupe : liste déroulante avec Groupe 1, Groupe 2, Groupe 3, etc. puis un autre choix, etc.
J’ai regardé la page recherche_par_mot.html, mais je n’y arrive pas vraiment...
Quelqu’un pourrait il m’aider ?
Répondre à ce message
À noter : le critère
{mots}
ne s’applique pas à... la boucle MOTS ! Dans ce cas, il suffit de faire :Répondre à ce message
Une alternative qui ne nécessite pas le plugin, via @denisb
intéressant ! utile effectivement, mais ne permet pas de gérer les cas avec un nombre potentiellement illimité de mot.
Répondre à ce message
Bonjour,
Il semble y avoir un problème (v1.2.3 sous SPIP 2.1.21).
Si j’effectue un simple :
Et qu’AUCUN article n’a les 2, ça retourne tous les articles au lieu de n’en retourner aucun !!
Debug :
$boucle->where[] = "ntt".'$mots_where';
j’obtiens ’’ (chaine vide) donc pas de condition au lieu d’une condition fausse... (mais même en le fixant en dur, cela ne change pas grand chose...)
J’avoue que c’est un peu obscur pour moi...
Une idée ?
Julien
Précisions sur le debug :
Dans la fonction « critere_mots_dist », si je rajoute le code suivant après le $boucle->hash .= ’....’ :
Du coup, le $mots_where est bien connu...
Mais pour que ça fonctionne il faut de plus remplacer la ligne
$boucle->where[] = "\n\t\t".'$mots_where';
par$boucle->where[] = "\n\t\t"."'$mots_where'";
Sachant que si on le fait, ça ne fonctionnera plus dans le cas ou il y a effectivement au moins un article avec les 2 mots clés...
il faudrait que je fasse des tests. J’essaierai de le faire demain après le boulot. N’hésitez pas seulement à me relancer sur le sujet
Super, merci Maïeul !
Je pense que spip filtre certains test trop stupide, du type WHERE 1=0.
Bref, http://zone.spip.org/trac/spip-zone/changeset/73711 permet de résoudre le pb. Le zip à jour sera disponible peu après 20h
Et ben j’aurai pu chercher longtemps !
Ça fonctionne parfaitement désormais. Un grand merci pour pour ta réactivité.
Julien
Répondre à ce message
Bonjour,
Je n’ai peut-être pas compris comment faire fonctionner ce plugin.
La page de demo
/?page=demo/parmots
trouve bien tous les groupes de mots et tous les mots.Par contre si j’insère dans ma page sommaire ou dans une page article, selon votre exemple le code :
Rien ne s’affiche, ni groupes de mots ni mots.
Où est mon erreur ?
Merci
salut,
je ne comprend ton pb, vu que la copie d’écran affiche bien quelque chose (même si pb de chaînes de langues, j’en conviens)
Tu peux fournir une URL ?
malheureusement je ne suis pas l’auteur de cette fonctionnalité et du coup je ne sais pas trop comment cela fonctionne.
salut,
je m’apercois que je n’ai pas répondu...
le pb est-t-il tjr là ?
Rien ne s’affichait. Après changement de navigateur et plusieurs recalcules un choix s’affiche dans la liste déroulante.
Par contre, il n’y pas la déclinaison proposée au-delà d’un premier mot, donc cela n’apporte à priori rien de plus.
Un lien vers une page d’essai du plugin : www.abipro95.com/ ?page=sommaire2
Merci
Répondre à ce message
Bonjour,
Ce plugin me sauve ! merci. Par contre je n’arrive pas à le faire fonctionne lorsque
est placé dans le bloc navigation des pages articles (j’utilise ZPIP et composition) : il ne détecte aucun groupe de mots clés alors que situé dans une page indépendante cela fonctionne très bien.
Il y a sûrement un critère d’environnement ou autre qui restreint la sélection mais je ne trouve pas comment le résoudre.
Merci
hum, malheureusement je ne suis pas spécialiste de zpip, mais a priori comme cela, je dirais qu’il faut vérifier que le fichier
body.html
du thème actif inclus bien le bloc de navigation via<INCLURE{fond=navigation/#ENV{type},env}>
, avec le env complet.Bonsoir,
merci de ta réponse. Oui le body est conforme (je n’y ai pas touché).
Lorsque je suis sur la page
site/?page=recherche_mot
(construite avec Z) tout fonctionne avec :Si je suis sur un squelette d’article je peux choisir mes groupes de mots et les mots clés mais l’URL rechargée donne :
site/?article12&mots[]=94
et donc on reste sur la même page sans avoir les résultats.
dd
Répondre à ce message
bonjour,
avec spip 3.0.5, le plugin et une boucle SITES, il y a un bug dans la requête sur la table spip_mots_liens, l’objet recherché est « syndi » alors que dans la table, l’objet enregistré est « site »
bien vu ;-)
j’ai reperé où était le problème, j’essaierai de le résoudre ce week-end.
je viens d’apporter le correctif.
http://zone.spip.org/trac/spip-zone/changeset/70134
le zip devrait normalement être prêt à 18h.
Répondre à ce message
Besoin d’un avis.
J’ai adapté le plugin pour ma navigation. Au départ c’était très efficace mais plus le site prend de l’empleur et plus il y a de visites et plus je trouve la navigation lente... trop lente pour ajouter plusieurs critères.
http://www.librairie-interactive.com/spip.php?page=mot&mots[]=27
je vous mets mon code issu du formulaire du plugin :
Merci d’avance pour votre aide.
heu, d’abord je vous déconseille d’utiliser
#ENV**
.Ensuite j’ai du mal à voir la lenteur. Par contre le formulaire n’a pas l’air de marcher (ou alors c’est cela la lenteur, tellement lent qu’on a l’impression que c’est pété).
Par ailleurs, je ne vous voix pas utiliser le critère
{mots}
, docn j’avoue ne pas saisir pourquoi vous écrivez ici.Je vous conseille pour tester vos problème d’utiliser le ?var_profile de spip (vous trouverez de la doc sur internet) qui vous permettra de savoir quels est la boucle problématique.
Bref, tout cela pour dire que j’ai un peu du mal à vous aider. Désolé =(
Je pense bien poster au bon endroit puisqu’il s’agit du formulaire du plugin présenté sur cet article.
Je ne suis pas l’auteur du ENV** qui vient du code d’origine.
Je ne connaissais pas ?var_profile mais ça ne semble pas fonctionner sur mon site. Je colle le code à la suite de mon url, en étant logué en admin mais la page du site s’affiche normalement et n’apporte donc aucune information.
j’imagine que je rate quelque chose ?
Pour ce qui est du formulaire, il fonctionne, très lentement parfois et à priori, cela est en lien avec le nombre de personnes sur le site.
il faudrait voir avec Real3T qui est à l’origine du forme. Je le previens.
Si ça peut aider quelqu’un j’ai un peu avancé. J’’ai modifié le fichier du formulaire « recherche_par_mots.html » en remplaçant l’inclusion de « recherche_par_mots_compteur » par
Le squelette en question utilisait une boucle article avec une pagination de 1 et un grand total qui ralentissait énormément (trop) la requête.
Du coup, ça marche beaucoup plus vite (mais on perd) l’information sur le nombre d’articles que l’on va obtenir en choisissant d’ajouter le mot clé en question.
@Maïeul
« tellement lent qu’on a l’impression que c’est pété » je crois que le gardien du SQL privé OVH devait stopper la requête trop longue !
Malheureusement je n’ai pas encore complètement résolu mon problème. Le choix d’un nouveau mot clé est rapide à présent (2 à 3 secondes) mais plus on rajoute de mots clés, plus l’affichage des résultats devient long (dès que l’on dépasse 2-3 mots) alors que normalement, le nombre d’articles concernés allant en diminuant (du fait d’un filtre plus précis), l’affichage des résultats devrait être plus rapide (au pire aussi rapide qu’au début).
Même la pagination devient de plus en plus lente (voir extrèmement lente) lorsqu’il y a plusieurs mots sélectionnés !
Je ne sais pas du tout de quel côté chercher ! Je suis preneur de toute proposition.
Pour test : http://www.librairie-interactive.com/spip.php?page=mot&mots[]=14
Merci d’avance
Répondre à ce message
Bonjour,
J’utilise ce plugin, j’ai 3 groupes de mots de clés et la recherche se passe bien, mais j’aimerai afficher dans la page résultat le titre des mots clés choisi pour la recherche et cela me pause problème. Pourtant j’ai mis la boucle mot mais rien ne s’affiche. Merci de votre aide. Voici la boucle de mon résultat :
je suis assez étonné : je ne vois rien de problematique dans la boucle.
Il faudrait regarder la requete SQL générée, via le
?var_mode=debug
Merci pour votre réponse la boucle est correcte et les résultats sont bon aussi. Ce que j’aimerai c’est d’afficher les titres des mots choisit. Par exemple kan je choisis les mots clés : mot1, mot2 et mot3, j’aimerai afficher dans ma page resultat dans une balise
<h1></h1>
les mots clés choisis séparé par une virgule et afficher juste en bas la liste de tous les articles liés aux mots choisis :mot1, mot2, mot3
liste article
j’ai fais ces boucles mais j’arrive tjrs pas a récupéré le titre des mots clés :
Merci de votre aide
Bonjour tout le monde et à Maïeul,
Vous n’avez toujours pas de réponse à ma question
J’ai essayé toutes les boucles possibles en mots clés, mais toujours pas de résultat. Merci encore de votre aide
a je comprend mieux ce que vous voulez. Votre présentation de départ n’était pas claire : je croyais que la boucle vous retournait un mauvais résultat. En fait vous voulez une nouvelle boucle pour autre chose.
La solution :
<BOUCLE_mots(MOTS){id_mot in #ENV{id_mot}}>...
bonjour Maïeul,
La solution n’affiche rien malheureusement, je ne sais pas ce qui cloche. voici mon formulaire :
et voici la page du resultat.html
comme tu le vois dans le
<h1></h1>
j’ai bien mis la solution de la boucle mot pour afficher les titres mais rien ne s’affiche. Merci de ton aideen fait vu votre formulaire, il vous faut
<BOUCLE_mots(MOTS){id_mot in #ENV{mots}}>...
.Je vous invite à lire La balise #ENV
Salut Maïeul,
Merci pour la réponse, j’y était presque en faisant :
<BOUCLE_mot(MOTS){id_mot=#ENV{mots}}>#TITRE</BOUCLE_m>
au lieu de ta boucle
<BOUCLE_mot(MOTS){id_mot in #ENV{mots}}>#TITRE</BOUCLE_m>
Mais je ne comprend toujours pas pourquoi il ya que le titre du group1 qui est affiché, même si
je choisis 2 ou 3 mots clés...où se trouve le problème ? Merci encore de ton aide
tu aurais un url de demo ?
Salut,
voici l’url URL
Merci de ton aide !
PS : Il ya que le titre du mot clé de groupe1 qui s’affiche, sinon les autres ne s’affichent pas. Même si on choisit 2 ou 3 mots clés, seul le tire de groupe1 s’affiche
Bonjour Maïeul,
vous avez vu l’url ?
je tombe sur une erreur 404.
le mieux serait que vous me fassiez parvenir un dump de votre base et vos squelette par email
ok, mea culpa.
Donc c’est
{id_mot IN #ENV{mots}}
avec le IN en majuscule.Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |