Il peut arriver parfois de vouloir sélectionner des objets SPIP (articles, rubriques, sites etc.), ayant un certains nombre de mot clefs connus.
Par exemple, je voudrais sélectionner les articles ayant les mots clefs « fruits » et « desserts », mais pas ceux qui n’ont que « déserts » 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}
Le critère {mots}
Prenons un exemple :
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 deux paramètres : ’score’ et ’tableau’. 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 en 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.
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.

- Le formulaire critère mots en action
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.



critere_mots.zip
Vos commentaires
# Le 1er février à 14:54, par ?
En réponse à : Critère {mots}
LENTEUR
Bonjour,
j’utilise le formulaire « n’affichant que certains groupes de mots » , il s’agit d’un groupe de mot contenant une centaine de mots clés.
lorsque je sélectionne un mot clé dans le menu déroulant j’ai un appercu du nombre d’articles qui répondent à ce critère, le temps d’affichage de ces articles est tes long, anormalement long, 15/20 secondes,
avez vous une astuce pour améliorer cette efficacité ?
merci
Répondre à ce message
# Le 2 mai 2011 à 13:26, par ?
En réponse à : Critère {mots}
Bonjour à tous,
J’arrive à filtrer en fonction d’un mot clef quand je le mets en dur dans le squelette.
Mais comment faire si je veux qu’il soit en variable sans qu’il passe par l’URL ?
je m’explique, c’est tout simple mais je n’ai pas trouvé comment faire :
je suis sur un article qui a pour mot clef « aaa » comment faire une boucle qui me donne tous les articles ayant le même mot clef ?
mon code pour le moment avec le mot en dur :
merci !
# Le 2 mai 2011 à 13:31, par Maïeul
En réponse à : Critère {mots}
Il faut que vous remplissiez dynamiquement le tableau mots.
Pour ce faire
<BOUCLE_mots>
#SET{mots,#GET{mots}|push{id_mot}}
</BOUCLE_mots>
Par ailleurs il faut que vous sortiez la boucle articles_mots de la boucle mot, sinonvous elle sera affichée autant de fois qu’il y a de mois à l’article.
# Le 2 mai 2011 à 15:06, par ?
En réponse à : Critère {mots}
Merci pour cette réponse rapide !
J’ai essayé ça, mais je ne dois pas avoir tout compris...
j’ai l’impression que de cette manière il ne comprend pas à quel mot l’array doit faire référence, je me trompe ?
Merci beaucoup du temps que vous m’accordez en tout cas
# Le 3 mai 2011 à 15:38, par ?
En réponse à : Critère {mots}
J’ai finalement réussi mais en laissant la boucle article dans la boucle mot
Je n’ai pas de problème de répétitions, même quand j’ai plusieurs mots clefs associés. Bizarre mais ça fonctionne
Le code pour ceux que ça intéresserait :
Merci pour ce plugin et pour ton aide précieuse
# Le 3 mai 2011 à 15:43, par Maïeul
En réponse à : Critère {mots}
votre seconde solution effectivement fonctionne … mais n’utilise pas ce plugin (pas de critères mots)
il utilise juste les possibilités standard de SPIP. Et le pb de répétition absent est normal, grâce au critère exclus.
par contre je ne comprend pas que le premier exemple n’ai pas fonctionné : est)ce que par hasard vous auriez #SETmots,#ARRAY dans la partie optionnelle d’une boucle ?
# Le 3 mai 2011 à 16:07, par ?
En réponse à : Critère {mots}
Ah ok... !
Non, je n’ai jamais utilisé #SET ou #ARRAY ailleurs que pour cette boucle dans les conditions énoncées plus haut. Mais mon niveau de développement est tellement proche de 0 qu’il est possible qu’une erreur quelque part ailleurs empêche votre solution de fonctionner !
Merci
# Le 20 décembre 2011 à 23:06, par Eerik Wissenz
En réponse à : Critère {mots}
J’avais la meme besoins : juste afficher les articles qui on tout (et que tout) les mots clef du context (genre les mots clef d’un rubriques ou un articles), puis ordre tout ca par date inverse.
Maïeul propose biens la bonned solution, merci, mais a oublier un « # » avant id_mots « push », et « id_mot » devrais etre « ID_MOT ».
#SET{mots,#ARRAY}
<BOUCLE_mot (MOTS) {id_article}>
#SET{mots,#GET{mots}|push{#ID_MOT}}
</BOUCLE_mot>
<BOUCLE_article_mot (ARTICLES){mots 100% #GET{mots}}{par date}{inverse}>
<a href="#URL_ARTICLE">#TITRE, </a>
</BOUCLE_article_mot>
Remarque, dans un context rubriques, just change « id_article » avec « id_rubrique » dans la premier boucle. Aussi, oublie pas de cocher dans la mot clefs groupe que tu peur associer ce les mots clef de ce group a des rubrique (c’est possible que pour des article par default, Spip 2.1.12).
Pardon mon francais, je suis Anglophone mais je me debroille en francais assez pour bien Spiper. Vive Spip !
Répondre à ce message
# Le 24 février 2010 à 15:37, par Nicolas Hoizey
En réponse à : Critère {mots}
Excellent !
Est-ce que vous pensez possible de rajouter un critère de tri par nombre de mots trouvés ?
Par exemple, je demande à avoir au moins 1 mot en commun, mais je voudrais mettre en avant ceux qui en ont plus...
# Le 3 mars 2010 à 17:12, par Maïeul
En réponse à : Critère {mots}
heu desolé, je ne connais pas assez le mysql pour faire cela. Peut-être que c’est possible, mais il faudrait que je me plonge dedans. Peut-être cet été.
# Le 14 décembre 2011 à 10:15, par bruno
En réponse à : Critère {mots}
Bonjour et merci,
tres utile
La nouvelle version permet-elle de resoudre ce pb
Bruno
# Le 14 décembre 2011 à 10:56, par Maïeul
En réponse à : Critère {mots}
pas à ma connaissance
Répondre à ce message
# Le 1er décembre 2011 à 19:08, par Loiseau2nuit
En réponse à : Critère {mots}
Je n’aurais que 2 mots : « BRAVO » et « MERCI » ! :-)
Répondre à ce message
# Le 6 novembre 2011 à 22:32, par michael
En réponse à : Critère {mots}
Une dernière petite question :
J’ai mis le formulaire sur la page mot puisque j’ai une navigation exclusivement par mot clé !. j’arrive donc toujours sur cette page en ayant suivi un lien mot.
J’aurais souhaité que l’id_mot que j’ai suivi soit prise en compte dans le tableau. Sans pour autant devoir modifier partout les liens sur les mots clés.
Est-ce possible ?
# Le 6 novembre 2011 à 22:48, par Maïeul
En réponse à : Critère {mots}
très probablement. Ce n’est pas moi qui ait créé ce formulaire, mais je suppose qu’il y a moyen de le modifier pour lui passer un paramètre id_mot. Après là je n’ai pas le temps de regarder exactement comment faire.
# Le 14 novembre 2011 à 17:16, par ?
En réponse à : Critère {mots}
Quelqu’un pourrait juste m’expliquer comment ajouter une id_mot récupérer dans les variables environnementales dans le tableau mots ?
Merci d’avance
# Le 14 novembre 2011 à 18:31, par Maïeul
En réponse à : Critère {mots}
merci de commencer un nouveau fil par nouveau sujet ;-)
pour le problème, un exemple de code aurait-été bon. Mais je t’envoie quand même vers la doc de la balise #ARRAY, qui devrait t’aider. Et si tu n’y arrive pas, et bien reviens :-) http://www.spip.net/fr_article4009.html
# Le 14 novembre 2011 à 19:06, par michael
En réponse à : Critère {mots}
Désolé mais je n’ai fait que continuer mon fil ! j’ai juste oublié de m’identifier !
Voila où j’en suis :
Au début de ma page mot, j’ai rajouté cette ligne :
[(#SET{mots,[(#ENV{mots, #ARRAY{}}|push{#ENV{id_mot}})]})]J’ai donc bien rajouté mon id_mot dans le tableau.
Seulement si j’inclus le formulaire recherche_par_mot sur la page mot en utilisant la balise #FORMULAIRE_RECHERCHE_PAR_MOTS, il va chercher la valeur du tableau en ENV et non en GET et ne tient donc pas compte de mon ajout.
J’essaie donc de mettre mon formulaire dans une noisette pour passer ma nouvelle variable mais ça ne change rien. Il me manque un truc mais je ne trouve pas pour le moment !
Répondre à ce message
# Le 6 novembre 2011 à 19:58, par michael
En réponse à : Critère {mots}
j’ai découvert ce plugin avant de commencer à développer mon site et je l’ai trouvé génial pour moi car j’envisageais une navigation par mots clés uniquement. J’y ai donc tout de suite vu une très bonne manière pour l’utilisateur de rajouter ou d’enlever des filtres de navigation.
Mais voilà, j’ai fait des choix lors de mon développement, notamment celui d’utiliser le plugin-squelette zpip et de démarrer avec un thème de départ à modifier.
Seulement voilà, au moment de mettre en place le plugin, je réalise qu’il ne fonctionne plus. Le formulaire affiche le select pour les groupes mais apres le choix, le select pour les mots du groupe ne s’affiche pas.
Apres avoir longtemps cherché, j’ai réalisé que le plugin fonctionnait si je changeais simplement le thème appliqué. j’en déduit donc que le thèmes tincrédible est coupable. Seulement voilà, j’en suis à un stade où je ne peux plus m’en passer. je dois donc trouver le pkoi du comment.
Si vous aviez une piste ou deux à explorer !!! Merci d’avance !
# Le 6 novembre 2011 à 20:43, par Maïeul
En réponse à : Critère {mots}
cela m’étonne que le thème trincredible empêche l’affichage. Un thème gère la présentation, pas le contenu. Vous auriez un site exemple ?
# Le 6 novembre 2011 à 20:49, par michael
En réponse à : Critère {mots}
Je peux le mettre en ligne sur mon pc si vous êtes encore là !
http://78.230.32.35/
# Le 6 novembre 2011 à 20:54, par michael
En réponse à : Critère {mots}
J’ai mis le switcher de thèmes ! La preuve est qu’il suffit de changer de thèmes pour que cela fonctionne.
# Le 6 novembre 2011 à 21:09, par Maïeul
En réponse à : Critère {mots}
effectivement !
pour le coup je pense que c’est thincredible qui met du js qui pose des soucis avec l’ajax natif de spip. Tu a essayer une pagination ajax par exemple ? ou un autre formulaire en ajax ?
le mieux serait de demander sur le forum de tincredible
# Le 6 novembre 2011 à 21:12, par michael
En réponse à : Critère {mots}
Les paginations fonctionnent et j’ai fait d’autres inclusions en ajax avec passage de variables qui fonctionnent.
En tous cas merci d’avoir regardé !
# Le 6 novembre 2011 à 22:09, par michael
En réponse à : Critère {mots}
Ben voilà ! Tu m’as mis sur la piste ! C’est bien le script pour le slider de la page d’accueil et qui était chargé dans le header directement depuis la surcharge du thèmes qui était en conflit ! Ce qui est étonnant car l’ajax fonctionnait malgré tout jusque là !
Bref ! j’ai déplacé le script sur la noisette du slider et le tou est joué !
Merci
Répondre à ce message
# Le 21 octobre 2011 à 18:20, par Christophe BORD
En réponse à : Critère {mots}
Bonjour,
En utilisant ce plugin de la manière décrite avec un paramètre d’inclusion je rencontre un écueil :
Dans un premier squelette je calcule un tableau criteres avec #SET et j’aimerais le passer comme paramètre à mon inclusion.
tabCriteres est un filtre qui me renvoie un tableau, cette partie fonctionne.
....
Dans le second squelette inclus se trouve ma boucle :
Ma boucle ne me donne pas de résultats. Avant l’inclusion le tableau compte pourtant bien plusieurs éléments. Quelque chose m’échappe ?
# Le 21 octobre 2011 à 18:23, par Christophe BORD
En réponse à : Critère {mots}
Les parenthèses surnuméraires sont une étourdrier de ma part, je voulais mettre en gras.
# Le 23 octobre 2011 à 12:03, par Maïeul
En réponse à : Critère {mots}
le passage des #SET ne se fait pas automatiquement dans les squelettes inclus. Ce sont les #ENV qui le font.
Donc pour toi il faudrait que tu fasse :
Cela signifie que tu passe comme paramètre d’environnement
criteresle contenu de#GET{criteres}et dans le squelette inclus :
# Le 24 octobre 2011 à 16:32, par Christophe BORD
En réponse à : Critère {mots}
Merci Maieul, ca m’avait complètement échappé.
# Le 25 octobre 2011 à 11:26, par Christophe BORD
En réponse à : Critère {mots}
Si en plus le critère est optionnel
{mots? 100% #ENV{criteres}}fonctionne très bien.
Comme ça n’allait pas de soi en ce qui me concerne, ça peut peut être servir à d’autres.
Répondre à ce message
# Le 12 octobre 2011 à 16:55, par fredjust
En réponse à : Critère {mots}
Bonjour
J’aimerais afficher la liste complète des mots clefs discriminants.
J’arrive à récupérer une liste d’articles associée à des mots clefs,
mais comment peut on récupérer les mots cléfs supplémentaires utiles pour affiner la recherche ?
C’est à dire qu’après avoir récupérer les articles ayant le mot clef A,
une liste me propose les mots clefs B et C car un article possède les mot A et B
et un autre les mots A et C.
C’est ce que semble faire l’exemple fourni dans le plugins dans les SELECT,
mais j’aimerais afficher une liste directement cliquable des mots clefs "ajoutables"
comme l’est actuellement celle des mots clef "supprimables" dans l’exemple.
Cela serait extremement pratique comme mode de recherche.
Est ce possible ?
Merci beaucoup
# Le 13 octobre 2011 à 12:55, par Maïeul
En réponse à : Critère {mots}
oui c’est possible (même si je ne comprend pas tout ce que tu veux). Tu connais un peu ou pas du tout le système de boucles de SPIP ?
# Le 13 octobre 2011 à 14:47, par fredjust
En réponse à : Critère {mots}
je connais un peu oui, je me débrouille avec les boucles de base
pour préciser mon idée :
cas pratique :
Merci
# Le 13 octobre 2011 à 19:05, par Maïeul
En réponse à : Critère {mots}
Alors il faut que tu stocke dans un tableau (#ARRAY) les id_article associés aux mots déjà sélèctionnés. Puis que tu fasse une boucle mots en prenant comme critère les id_articles de ce tableau.
Quelquechose du genre :
<BOUCLE_articles(ARTICLES){mots}>
#SET{id_articles,#GET{id_articles}|push{#ID_ARTICLE}}
</BOUCLE_articles>
<BOUCLE_mots_articles(MOTS){id_article IN #GET{id_articles}}>
#ID_MOT
</BOUCLE_mots_articles>
</B_articles>
<BOUCLE_mots(MOTS)>
#ID_MOT
</BOUCLE_mots>
<//B_articles>
# Le 14 octobre 2011 à 19:18, par fredjust
En réponse à : Critère {mots}
merci je vais tester ca
Répondre à ce message
# Le 14 septembre 2011 à 12:17, par jeromelt
En réponse à : Critère {mots}
Le FORMULAIRE_RECHERCHE_PAR_MOTS permet de sélectionner les mots clés d’un groupe de mot.
Cette sélection se fait assez lentement car il faut d’abord choisir 1 mot, le calcul se fait... les résultats s’affichent.
Ensuite on peut choisir un autre mot, etc.
Est il possible plutot qu’un menu déroulant d’afficher la liste des mots clés sous forme de liste à cocher afin d’effectuer une recherche multicritère en une seule fois ?
ou à défaut permettre de sélectionner plusieurs mots clés dans le menu déroulant ?
Pouvez vous m’aider à réaliser cela ?
# Le 14 septembre 2011 à 12:23, par Maïeul
En réponse à : Critère {mots}
tu connais les boucles de SPIP ou pas ? pour savoir quel degrees d’explication je dois fournir …
# Le 14 septembre 2011 à 14:29, par jeromelt
En réponse à : Critère {mots}
oui je connais le fonctionnement général.
à mon sens il s’agirait de modifier la page recherche_par_mot.html ou d’en créer une autre à partir de celle ci recherche_par_mot2.html que je rangerais dans mon dossier squelette/formulaires ?
ensuite suffit t’il de modifier le type de select ?
# Le 14 septembre 2011 à 18:34, par Maïeul
En réponse à : Critère {mots}
c’est ca. tu peux opter pour l’une ou l’autre des solutions, du moment que tu place tout cela dans ton dossier squelettes.
Il suffit de modifier le squelette du formulaire et celui qui affiche les mots à la sortie du formulaire. Normalment la doc permet à une personne qui connaît les boucles de faire les modifs. Si tu bloque envoie moi ton code.
Répondre à ce message
# Le 12 septembre 2011 à 20:40, par lala
En réponse à : Critère {mots}
salut,
J’ai mis en place un moteur de recherche voir l’image jointe, mais en dehors des mots j’ai un champ input que l’internaute doit remplir. Pour l’instant si je choisis les mots clés j’ai un résultat par contre si je cherche la présence d’un mot dans les titres des articles ou dans les textes en tapant un mot dans le champ input j’ai pas de résultat. Est ce quelqu’un peut m’aider ??
# Le 12 septembre 2011 à 20:45, par Maïeul
En réponse à : Critère {mots}
les mots qu’on frappe dans le input doivent être cherché parmis les mot clefs ou dans le corps du texte ?
tu a ton code ?
# Le 13 septembre 2011 à 15:10, par lala
En réponse à : Critère {mots}
Merci de votre réponse
finalement ca marche, les mots qu’on frappe dans le input doit cherché dans le corps du texte
voici quand même le formulaire :
<form action="spip.php?page=resultat" method="get" >
<input name='page' value='resultat' type='hidden' />
[<input name='lang' value='(#ENV{lang})' type='hidden' />]
<!-- la chaine cherchee -->
<input type="text" class="forml" name="recherche" id="recherche-avancee" value="#RECHERCHE" />
<B_g1>
<select name="mots[0]">
<BOUCLE_g1(GROUPES_MOTS){id_groupe IN 3}>
<option value="">#TITRE</option>
<BOUCLE_surmot(MOTS){id_groupe}{par multi titre}>
<option value="#ID_MOT" [(#ENV{id_mot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
</BOUCLE_surmot>
</select>
</BOUCLE_g1>
</B_g1>
<B_g2>
<select name="mots[1]">
<BOUCLE_g2(GROUPES_MOTS){id_groupe IN 4}>
<option value="">#TITRE</option>
<BOUCLE_surmot2(MOTS){id_groupe}{par multi titre}>
<option value="#ID_MOT" [(#ENV{id_mot}|=={#ID_MOT}?{"SELECTED"})]>#TITRE </option>
</BOUCLE_surmot2>
</select>
</BOUCLE_g2>
</B_2>
<input type="submit" class="bouton" value="<:rechercher:>" />
</form>
Pour la page resultat :
Répondre à ce message