Sélection contextuelle des articles d'un flux RSS selon les mots clés de l'article

Bonjour,

Je vous brosse le tableau pour que vous aillez une vue générale avant de vous soumettre ma question :
Je travaille actuellement sur un site (multilingue) de cette conception :
Secteur Français
-> sousrubriques diverses
-> sousrubrique "publicité"

Secteur Anglaise

Secteur Espagnol

En fait j'ai dans le secteur "Français" une rubrique "publicité" qui contient des articles pour ajouter des publicité sur le côté droit du site (dans cette rubrique , chaque article est une publicité, chaque site référencé est celui d'un partenaire ).
Par exemple mon partenaire est une librairie qui vend des livres sur divers sujets et dont j'ai syndiqué le flux. Ce flux diffuse l'intégralité des ouvrages proposés. Pour résumé j'aimerai faire automatiquement une recherche dans le flux en fonction des mots clés de mes articles .

Je développe :
Lorsque j'écris un article sur le site, par exemple un article sur la vie des manchots, j'attache à l'article les mots clés "manchots","Antartique" et si je fais un articles sur les zèbres, j'attache les mots clés "zèbres" et "Afrique"... etc.

En fait, j'aimerai faire une boucle qui, en fonction des mots clés attachés à l'article, recherche dans les titres du flux rss, la chaîne de caractères correspondantes aux mots clés .
Exemple, si l'article a le mot clé "manchots", la boucle me sortira les 2 ouvrages "Le dernier empereur: vie des manchots" et la BD "le Bandit manchot" (Lucky-Lucke)- même si cela n'a aucun rapport !
(L'idéal serait que cette recherche ne tienne pas compte de la casse et puisse chercher une chaine de caractères raccourcie comme "manch" ou composée comme "Fou de bassan"). mais bon... faut pas pousser ! :slight_smile:
Cette boucle marche... les proposition de livres s'affichent mais j'aimerai bien que ce soit une variable à la place de "manchots" et que la boucle puisse prendre en compte plusieurs mots...

<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre==(manchots)}

Un truc comme ceci ? (bien entendu, cela ne marche pas... et je ne parviens pas à trouver la bonne syntaxe...

<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre==([(#ENV{titre_mot})|])}

Petits plus, j'aimerai qu'il fouille ensuite dans le texte du flux RSS... et si les résultats sont vides, qu'il propose autre chose au hasard...
35 étant l'id du site dont j'affiche le flux

Une sorte de micro "googleads" interne en somme !

Si vous avez d'autres idées, des améliorations je suis preneur !

Merci de votre aide.

Bonne journée.

Vincent

<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre==(manchots)}

Un truc comme ceci ? (bien entendu, cela ne marche pas... et je ne parviens pas à trouver la bonne syntaxe...

<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre==([(#ENV{titre_mot})|])}

Bonjour,
je ne suis pas sur d avoir tout compris, mais...
Sur une boucle articles, on peut faire une recherche avec comme critere {titre_mot==^#ENV{mot_cle}}

me semble meme avoir vu passer sur cette liste une recherche du type %like% mais je ne retrouve plus le message....
triton

triton a écrit :

me semble meme avoir vu passer sur cette liste une recherche du type %like% mais je ne retrouve plus le message....

au choix :
   http://thread.gmane.org/gmane.comp.web.spip.user/142872/focus=142882
   http://thread.gmane.org/gmane.comp.web.spip.devel/51867/focus=51870

Bonsoir,

Merci à tous pour votre aide précieuse.
J'ignorais l'existence de ce filtre et c'est génial mais...
En fait, pour moi, cela ne fonctionne malheureusement pas :

J'ai testé ceci :
<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre LIKE %(#ENV{mot_cle})%}>
qui me retourne une chaine vide (en mode debug : (syndic_articles.titre LIKE '%%')
et ceci
<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre LIKE %(#ENV{titre_mot})%}>

Même retour SQL ((syndic_articles.titre LIKE '%%')

Pour voir si je n'avais pas fait d'erreurs j'ai testé avec l'id de l'article
<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre LIKE %(#ENV{id_article})%}>
Et là cela me retourne bien l'identifiant de l'article (j'ai vérifié en mode debug) . Donc la boucle est bonne et cela devrait fonctionner.

J'ai aussi fait le test simple et cela fonctionnait.
  <BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre LIKE %monmotrecherché%}>

Autre question : ce type de filtre peut-il servir (et si oui "comment"?) lorsqu'il y a plusieurs mots clés (comme le fait le filtre (titre==(premiertermerecherché|secondtermerecherché|troisièmetermerecherché)} ?

Merci de m'éclairer.

Je suis sur la bonne piste... on progresse, on progresse !

Bonne nuit.

Vincent

denisb a écrit :

triton a écrit :

me semble meme avoir vu passer sur cette liste une recherche du type %like% mais je ne retrouve plus le message....

au choix :
  http://thread.gmane.org/gmane.comp.web.spip.user/142872/focus=142882
  http://thread.gmane.org/gmane.comp.web.spip.devel/51867/focus=51870

Vincent a écrit :

J'ai testé ceci :
<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre LIKE %(#ENV{mot_cle})%}>
qui me retourne une chaine vide

il n'y a manifestement pas de mot_cle dans le contexte (passage en url ? en paramètre de modèle ou d'inclure ?)

<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre LIKE %(#ENV{titre_mot})%}>
Même retour SQL ((syndic_articles.titre LIKE '%%')

idem

Autre question : ce type de filtre peut-il servir (et si oui "comment"?) lorsqu'il y a plusieurs mots clés (comme le fait le filtre (titre==(premiertermerecherché|secondtermerecherché|troisièmetermerecherché)}

ha non. pour cela il faut soit passer par une regexp :
{titre == ^(premierterme|secondterme|troisièmeterme)$}
soit par un IN :
{titre IN premierterme,secondterme,troisièmeterme}

Bonjour,

Merci encore pour cette précision (effectivement les mots clés ne sont pas dans l'url ) :

Comment faire pour faire passer les résultats de cette boucle ci-dessous (par exemple j'ai 3 mots clés dans cet article (disons... "manchots", "zèbre", "lion")

<BOUCLE_recuperationdesmotsdelarticle(MOTS){id_article=#ENV{id_article}}>

  [(#TITRE)]

</BOUCLE__recuperationdesmotsdelarticle>

Dans cette boucle-ci.

<ul>
<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre IN premierterme,secondterme,troisièmeterme} >
[<li><a href="#URL_ARTICLE">(#TITRE|liens_ouvrants)</a></li>]
</BOUCLE_pub>
</ul>

(si c'est possible sans PHP ... cela m'arrange ! ) :blush:

Bonne journée.

Vincent

denisb a écrit :

Vincent a écrit :

J'ai testé ceci :
<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre LIKE %(#ENV{mot_cle})%}>
qui me retourne une chaine vide

il n'y a manifestement pas de mot_cle dans le contexte (passage en url ? en paramètre de modèle ou d'inclure ?)

<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre LIKE %(#ENV{titre_mot})%}>
Même retour SQL ((syndic_articles.titre LIKE '%%')

idem

Autre question : ce type de filtre peut-il servir (et si oui "comment"?) lorsqu'il y a plusieurs mots clés (comme le fait le filtre (titre==(premiertermerecherché|secondtermerecherché|troisièmetermerecherché)}

ha non. pour cela il faut soit passer par une regexp :
{titre == ^(premierterme|secondterme|troisièmeterme)$}
soit par un IN :
{titre IN premierterme,secondterme,troisièmeterme}

Vincent a écrit :

Bonjour,

Merci encore pour cette précision (effectivement les mots clés ne sont pas dans l'url ) :

Comment faire pour faire passer les résultats de cette boucle ci-dessous (par exemple j'ai 3 mots clés dans cet article (disons... "manchots", "zèbre", "lion")

<BOUCLE_recuperationdesmotsdelarticle(MOTS){id_article=#ENV{id_article}}>

[(#TITRE)]

</BOUCLE__recuperationdesmotsdelarticle>

Dans cette boucle-ci.

<ul>
<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre IN premierterme,secondterme,troisièmeterme} >
[<li><a href="#URL_ARTICLE">(#TITRE|liens_ouvrants)</a></li>]
</BOUCLE_pub>
</ul>

Bonjour,
il faut que l url qui charge ton sequelette SYNDIC_ARTICLES contienne les parametres mot cle, regarde par la : Les balises propres au site - SPIP
Il te faut obtenir une url du type spip.php?page=monsqueletteSYNDIC&premierterme=manchot&deuxiemeterme=pingouin
tu peux effectuer des tests sur ton squelette en modifiant dirrectement l url
triton

Vincent a écrit :

Comment faire pour faire passer les résultats de cette boucle ci-dessous (par exemple j'ai 3 mots clés dans cet article (disons... "manchots", "zèbre", "lion")

[(#REM) déclaration et initialisation du tableau à vide]
#SET{titre_in, #ARRAY{}}

<BOUCLE_recup_mots_art(MOTS) {id_article = #ENV{id_article}}>
   [(#REM) remplissage du tableau]
   [(#SET{titre_in, #GET{titre_in}|push{#TITRE}})]
</BOUCLE__recup_mots_art>

<ul>
<BOUCLE_pub(SYNDIC_ARTICLES) {id_syndic=35} {titre IN #GET{titre_in}}>
   [<li><a href="#URL_ARTICLE">(#TITRE|liens_ouvrants)</a></li>]
</BOUCLE_pub>
</ul>

denisb a écrit :

Vincent a écrit :

Comment faire pour faire passer les résultats de cette boucle ci-dessous (par exemple j'ai 3 mots clés dans cet article (disons... "manchots", "zèbre", "lion")

[(#REM) déclaration et initialisation du tableau à vide]
#SET{titre_in, #ARRAY{}}

<BOUCLE_recup_mots_art(MOTS) {id_article = #ENV{id_article}}>
  [(#REM) remplissage du tableau]
  [(#SET{titre_in, #GET{titre_in}|push{#TITRE}})]
</BOUCLE__recup_mots_art>

<ul>
<BOUCLE_pub(SYNDIC_ARTICLES) {id_syndic=35} {titre IN #GET{titre_in}}>
  [<li><a href="#URL_ARTICLE">(#TITRE|liens_ouvrants)</a></li>]
</BOUCLE_pub>
</ul>

Elegant !

Faut le plugin bonux pour utiliser push, me semble ?
triton

denisb a écrit :

Vincent a écrit :

Comment faire pour faire passer les résultats de cette boucle ci-dessous (par exemple j'ai 3 mots clés dans cet article (disons... "manchots", "zèbre", "lion")

[(#REM) déclaration et initialisation du tableau à vide]

hmmm...
parfois j'imagine que ce sera plus simple de passer direct
la combi recherchée dans un unique parametre

<inclure(...){cequejeveux=manchots,zebres,lion}>
pour une boucle avec critère IN adapté
dans le fichier inclu

et
<inclure (){cequejeveux=manchots|sebres|lion}>
pour unr boucle avec critère == adapté
dans le fichier inclu.

Faut un peu expérimenter en tâtonnant parfois...

JL

JLuc a écrit :

<inclure(...){cequejeveux=manchots,zebres,lion}>
pour une boucle avec critère IN adapté
dans le fichier inclu

sauf que là, on cherche à *construire* le tableau (on n'a pas les éléments) pour l'utiliser *ensuite*

de plus, 'cequejeveux' sera passé comme string et non comme array() (ce qui est attendu attendu par un IN)
du coup tu auras un sql : WHERE table.champ IN (manchots)

denisb a écrit :

JLuc a écrit :

<inclure(...){cequejeveux=manchots,zebres,lion}>
pour une boucle avec critère IN adapté
dans le fichier inclu

sauf que là, on cherche à *construire* le tableau (on n'a pas les éléments) pour l'utiliser *ensuite*

Le tableau est il un objectif ?
Il me semblait que ce n'était qu'un moyen.

de plus, 'cequejeveux' sera passé comme string et non comme array() (ce qui est attendu attendu par un IN)

IN accepte les tableaux, certes, mais aussi les chaines normales.

JL

JLuc a écrit :

IN accepte les tableaux, certes, mais aussi les chaines normales.

j'ai un doute soudain : les chaines normales ne seraient-elles
pas acceptées quand elles sont valeur d'un GET ? :frowning:
Ce IN ne serait pas très finaud...
JL

JLuc a écrit :

j'ai un doute soudain : les chaines normales ne seraient-elles
pas acceptées quand elles sont valeur d'un GET ? :frowning:

non.

Eureka !

Après moults essais , j'y suis arrivé...
Ceci marche sans php, et sans complications dans le code (chacun son niveau !) sans passage non plus de parmêtres dans l'url.
Ouf... J'y aurais passé du temps. Mais c'est ainsi qu'on progresse !

Après coup cela semble évident... mais j'ai galéré tout de même.

<BOUCLE_recup_mots_art(MOTS){id_article=#ENV{id_article}}>
   #TITRE
<BOUCLE_pub(SYNDIC_ARTICLES){id_syndic=35}{titre==(#TITRE)}>
   [<a href="#URL_ARTICLE">(#TITRE)</a></li>]
</BOUCLE_pub>
</BOUCLE_recup_mots_art>

Les résultats de la recherche dans les articles syndiqués se présentent ainsi.

Mot clé manchots
"vie des manchots" Editions patapon
"bandit manchot" Editions snock

Mot clé zèbre
"zou le petit zèbre" Editions Bordas
"les zèbres dans la savane" Editions Zoulou

Si cela peut servir à quelqu'un.

Encore une fois, merci à tous pour votre aide !

Bonne soirée.

Vincent

JLuc a écrit :

JLuc a écrit :

IN accepte les tableaux, certes, mais aussi les chaines normales.

j'ai un doute soudain : les chaines normales ne seraient-elles
pas acceptées quand elles sont valeur d'un GET ? :frowning:
Ce IN ne serait pas très finaud...
JL