Exclure selon un mot-clé

Cette boucle permet d’exclure de l’affichage une liste d’articles, de rubriques, de brèves ou de sites en fonction d’un mot-clé.

Cette boucle fait suite à celle proposé dans l’article 563 : Afficher selon un mot clé


<BOUCLE_exclure (ARTICLES) {titre_mot=exclu} {doublons}>
</BOUCLE_exclure>

<BOUCLE_afficher_non_exclus (ARTICLES) {tout} {doublons} >
<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_afficher_non_exclus>

Remarques :

-  Toute l’astuce de cette boucle réside dans l’usage du critère doublons. En effet, la première boucle (BOUCLE_exclure) sélectionne parmis les ARTICLES ceux qui sont dotés du mot clé exclu (titre_mot=exclu).
La seconde boucle (BOUCLE_afficher_non_exclus) affiche tous (tout) les ARTICLES, à l’exception de ceux qui on déjà été sélectionnés par une boucle précédente dotée elle aussi d’un critère doublons.

-  On pourra remplacer ARTICLES par RUBRIQUES, BREVES ou SITES selon ce que l’on veut afficher.

Il faudra bien évidement adapter le contenu de href (#URL_RUBRIQUE, #URL_BREVE et #URL_SITE).

-  Ici, le mot clè est ’exclu’. On pourra le remplacer bien évidemment par n’importe quel autre mot clé. Attention toutes fois de s’assurer qu’on a pas deux mots clès avec le même ’titre’ dans deux groupes différents, c’est à dire deux mots clés au nom identique ; sauf bien évidemment si c’est un effet recherché.

Discussion

9 discussions

  • 1

    Seul souci avec cette méthode : quand on a une grande quantité d’articles exclus (parce qu’on a tout simplement une grande quantité d’articles sur le site), spip génère une méga requête avec des NOT IN(1,2,3,4,...etc) sur des lignes et des lignes...

    Quel dommage que le {id_mot != toto} ne prenne en compte que les articles ayant effectivement un mot clé ! Une piste que j’essaierai lundi : {id_mot != toto ?}

    Répondre à ce message

  • Bonjour,

    en utilisant les conseils de cette contrib, voici un petit exemple concret :

    1 - des articles sont sélectionnées en haut de page selon des mots clés qui appartiennent à un groupe (10) de mots clé. Les mots clés peuvent être attribués à des articles de toutes les rubriques

    2 - sous ces articles sélectionnés, il faut afficher la liste de tous les articles qui n’appartiennent qu’à 2 rubriques précises sans répéter ceux qui pourraient avoir un des mot clé du groupe 10 et sont donc déjà affichés en haut de page.

    Spip 1.9.2e

    Voici le résultat

    <BOUCLE_exclure (ARTICLES) {id_groupe=10} {doublons}>
    </BOUCLE_exclure>			
    
    <B_liste>
    <div class="liste-articles">
    [(#ANCRE_PAGINATION)]
    [(#ENV{debut_articles}|?{'',' '})]
    	<BOUCLE_liste(ARTICLES) {id_rubrique=17;3}{par date}{inverse} {doublons} {pagination}>
    	<h3 class="titre"><a href="#URL_ARTICLE">#TITRE</a></h3>
    	[<font class="texteliste">(#SOUSTITRE)]<small>[ - (#DATE|affdate_jourcourt)]</small>[<br />(#CHAPO)]</font>
    	</BOUCLE_liste>
    [<p class="pagination">(#PAGINATION)</p>]
    </div>
    </B_liste>

    La première boucle traite tous les articles qui ont un des mots clés du groupe 10.

    Je ne prends ensuite que les articles des rubriques 17 et 3 avec {id_rubrique=17;3} ce qui me permet d’exclure toutes les autres rubriques sans avoir à utiliser de mots clés.

    Répondre à ce message

  • 5
    Marcopol

    Que se passe-t-il lorsque l’on ajoute à la suite de cet exemple, une 3e boucle article avec le critère doublons ?

    • La trosième boucle sélectionnera tous les articles correspondant à ses critères, sauf ceux précédements sélectionnés par les autres boucles ’équipées’ du critère {doublons}.

      A notter qu’avec les boucles proposées en exemple, une troisième boucle ARTICLES ne donnera donc rien, puisque tous les articles sont sélectionnés par les deux premières. Il n’y en a donc aucun qui ait échappé à {doublons}.

    • C’est bien ce que j’ai constaté et ça me gène ; en effet dans ma page d’accueil j’affiche les nouveaux articles en 2 tranches (détail pour les plus récents et résumé ensuite), c’est à dire en 2 boucles

      <BOUCLE_article_un(ARTICLES){par date} {inverse} {0,5}>
      ............
      </BOUCLE_article_un>
      
      <BOUCLE_articles_recents(ARTICLES)  {par date} {inverse} {5,15}>
      ............
      </BOUCLE_articles_recents>

      Or je désire éliminer les articles d’une certaine rubrique, tout en conservant cette logique de présentation. Comment faire ?

    • OK.

      Tu veux exclure une rubrique. Donc tu lui associe le mot clé (par exemple) ’exclu’.

      Puis nous allons concevoir une boucle qui dientifiera toutes les rubriques attachées au mot-clé exclu :

      <BOUCLE_rubriques_exclues (RUBRIQUES) {titre_mot=exclu}>
      ...
      </BOUCLE_rubriques_exclues>

      Vient ensuite la boucle d’exclusion, qui est insérée à la place des ... de la boucle rubriques_exclues :

      <BOUCLE_exclure_articles_de_rubriques_exclues (ARTICLES) {doublons}>
      </BOUCLE_exclure_articles_de_rubriques_exclues>

      On notera que le critère {doublons} est appliqué à la boucle qui concerne les articles. Cela permet de laisser la possibilité d’afficher les rubriques associées à exclu. Et que la boucle exclure_articles_de_rubriques_exclues ne considére pas le mot-clé exclu, puisqu’il est ici utilisé avec la boucle RUBRIQUES.

      Ensuite, il est possible qu’il y ait des articles qui ne soient pas dans les rubriques exclues, mais dont tu ne veuille pas qu’ils soient affichés dans les nouveautés.
      Donc :

      <BOUCLE_exclure_articles_solos(ARTICLES) {titre_mot=exclu}{doublons}>
      </BOUCLE_exclure_articles_solos>

      Restent tous les autres articles.

      Parmis ces articles, tu veux les cinq plus récents.

      Donc :

      <BOUCLE_les_cinq_articles_les_plus_recents(ARTICLES) {par date}{inverse}{0,5}{doublons}>
      ............
      </BOUCLE_les_cinq_articles_les_plus_recents>

      Il reste donc tous les articles, sauf ceux qui sont dans une rubrique exclue, ceux qui sont exclus, et les 5 plus récents. Et tu veux récupérer parmis ceux-ci les 10 plus récents.

      Donc :

      <BOUCLE_les_dix_articles_les_plus_recents(ARTICLES) {par date}{inverse}{0,10}{doublons}>
      ............
      </BOUCLE_les_dix_articles_les_plus_recents>

      Toute la subtilité de la chose est dans le fait que {doublons} exclus les articles des sélections suivantes (si elles ont le critère {doublons} ! ). Donc, pour la boucle qui donne les dix articles les plus récents suivant les cinq plus récents, il faut bien choisir le critére d’affichage : {0,10}.

      C’est ce qui est expliqué dans la documentation au sujet des critères communs à toutes la boucles, section d’une partie des résultats, et plus particuliérement ce qui concerne les critères du type : {1/2}.

    • Ca n’affiche rien parce que la 1re boucle ARTICLE (celle qui est dans la boucle RUBRIQUE) sélectionne tous les articles. En ajoutant id_rubrique à cette boucle ARTICLE c’est l’effet inverse !

      Par contre, ton explication m’a aidé (les 2 dernière boucles sont justes), et j’arrive à m’en sortir comme suit en tirant parti du fait que les articles de ma rubrique à exclure ont obligatoirement le mot clé _Agenda. C’est d’ailleurs encore mieux car c’est le secteur qui est ainsi éliminé.

      <BOUCLE_exclure (ARTICLES){type_mot=_Agenda}{doublons}>
      </BOUCLE_exclure>
      
      <BOUCLE_article_un(ARTICLES){par date} {inverse}{0,5}{doublons}>
              Affichage detaillé
      </BOUCLE_article_un>
      
      
      <BOUCLE_articles_recents(ARTICLES){par date} {inverse}{0,15}{doublons}>
               Affichage sommaire 
      </BOUCLE_articles_recents>

      Merci beaucoup !

      Marc

    • Oups, exact...

      Bon, voilà le code complet et cortrigé qui devrait fonctionner :

      <BOUCLE_rubriques_exclues (RUBRIQUES) {titre_mot=exclu}>
         <BOUCLE_exclure_articles_de_rubriques_exclues (ARTICLES) {id_rubrique} {doublons}>
         </BOUCLE_exclure_articles_de_rubriques_exclues>
      </BOUCLE_rubriques_exclues>
      
      <BOUCLE_exclure_articles_solos(ARTICLES) {titre_mot=exclu}{doublons}>
      </BOUCLE_exclure_articles_solos>
      
      <BOUCLE_les_cinq_articles_les_plus_recents(ARTICLES) {par date}{inverse}{0,5}{doublons}>
      ............
      </BOUCLE_les_cinq_articles_les_plus_recents>
      
      <BOUCLE_les_dix_articles_les_plus_recents(ARTICLES) {par date}{inverse}{0,10}{doublons}>
      ............
      </BOUCLE_les_dix_articles_les_plus_recents>

    Répondre à ce message

  • 15

    Bonsoir Olivier,

    En spip 1.9.1 [7502] en localhost, ça ne marche pas. J’intègre les boucles d’exclusion, et les titres qui devraient disparaitre s’affichent toujours en ligne même après vidage des caches (spip et fifox)

    Déjà sur une 1.8.x je n’arrivais pas non plus à utiliser ta contrib.

    Saurais tu d’où ça peut venir ?

    Merci de ton aide.

    • Sans boucle exemple, je ne peux pas tellement te dire où est le problème…

      Est-ce que ta boucle exclure comporte au moins un espace entre et  ?

    • entre <BOUCLE_> et </BOUCLE_> ?

    • Je te poste la boucle. Désolé pour l’oubli.
      En fait, c’est la boucle de mon inc-rubrique.html

      <BOUCLE_no_rub(RUBRIQUES){tout}{titre_mot=invisible}{doublons}>
      </BOUCLE_no_rub>
      	
      <BOUCLE_rubriques(RUBRIQUES) {racine} {par num titre, titre}{doublons}>
          <a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|couper{80})]</a>
          <B_sous_rubriques>
          <BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}{doublons}>
               <BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}
               </BOUCLE_test_expose>
               <a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|couper{80})]</a>
               <BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
                </B_test_expose>
           </BOUCLE_sous_rubriques>
           </B_sous_rubriques>
      </BOUCLE_rubriques>
    • Cette boucle me semble fonctionnelle, tu devrais regarder ce que renvoie ta boucle d’exclusion en lui faisant afficher #ID_RUBRIQUE.

    • La boucle_no_rub ne renvoit désespérément rien ! Pas même la puce image que j’affiche devant le #ID_RUBRIQUE

      J’ai revérifié (juste au cas où je ne saurais plus écrire « invisible ») dans mon interface privée. Tout est OK de ce côté là.

      J’ai tenté en remplaçant/rajoutant des critères (racines) ou (tout) mais vraiment rien n’y fait. Je ne comprends plus.

    • Tu n’aurais pas un autre {doublons} qui interférerais ?

      Si tu met tes boucles toutes seules dans un fichier dédié, il se passe quoi ?

    • Là ca marche. Et la boucle no_rub me renvoit bien l’id de la rubrique que je cherche à shunter.

      Ce que je ne comprends pas, c’est que cette boucle se situe DEJA toute seule dans un fichier dédié. En l’occurence le inc_rubriques.html de la distrib de base. Et hormis pour tenter d’exclure cette rubrique, je n’ai pas modifier la boucle d’origine. A une ou deux puces graphiques près, et les (doublons) de ta contrib, le fichier est quasi identique à celui de la dist.

    • Bonjour Zzz,

      le fichier inc_rubriques.html est appelé à l’intérieur d’un autre fichier (sommaire.html) qui a lui-même des boucles.

      Ce sont peut-être celle-ci qui sont en conflit.

      Pour vérifier, d’où provient l’origine du conflit, tu peux essayer de mettre en commentaire toutes les autres boucles précédent celle de inc_rubriques.html, et les réactiver 1 par 1 jusqu’à trouver la coupable....

      Bon courage

    • Yep, ben quand tu sais que même mes fichiers rubriques, articles et les autres posent problème, je vais commencer maintenant alors parce que j’ai du « Spipain » sur la planche...

      En tout cas, merci à vous 2 pour vos coups de pattes ;)

    • Bonsoir,

      Plusieurs mois après la bataille, je reviens avec le même problème. En janvier dernier j’avais finis par contourner le problème en plaçant des {id_rubrique != XYZ} pour exclure les 2 rubriques que je voulais shunter mais là je suis sur un autre projet en 192c et je ne peux pas me permettre d’utiliser cette soluce parce que au final je ne sais pas combien de rubrique invisible mon client va vouloir me créer.

      Du coup je sèche gravement là.
      Et comparé à la dernière fois, ce coup-ci, la boucle, même isolée dans un fichier à part ne fonctionne pas. Je ne sais plus quoi faire là.

      ma boucle du jour, toujours dans dist/inc/rubriques.html :

      <B_rubriques>
        <div class="rubriques">
           <h2 class="menu-titre"><:rubriques:></h2>
      	<ul>
                 <!-- exclusion des rubriques invisibles -->
      		<BOUCLE_somm_exclure_rubrique(RUBRIQUES) {racine} {titre_mot=invisible} {doublons}>
      		   <li>[(#TITRE|couper{80})]</li>
      		</BOUCLE_somm_exclure_rubrique>
      
      		<BOUCLE_rubriques(RUBRIQUES) {racine} {par num titre, titre} {doublons}>
      		   <li>
      			<a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|couper{80})]</a>
      							
      			<B_sous_rubriques>
      			   <ul>
      			      <BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par num titre, titre}><BOUCLE_test_expose(RUBRIQUES) {id_enfant}>#EXPOSE{' '}</BOUCLE_test_expose>
      				<li><a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>[(#TITRE|couper{80})]</a><BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	</li>
      									</B_test_expose></BOUCLE_sous_rubriques>
                               </ul>
      	              </B_sous_rubriques>
      						
      		</li>
      	    </BOUCLE_rubriques>
      				
      	</ul>
         </div>
      </B_rubriques>

      Si quelqu’un a une idée, je lui paie une bière à la prochaine Party où je me pointe et où je le croise.

      Bonne nuit à tous.

      EDIT : Bon... on en parle aussi ici si ca peut servir à quelqu’un...

    • EUREKA !!!!

      En fait, ce sont les déclaration <B_rubrique> et </B_rubrique> qui posaient problème.

      En les supprimant, j’arrive à faire ce que je voulais faire.

      Merci à la liste Spip-user en tout cas pour les pistes proposées ;)

      Pour info, la boucle finalement opérationnelle :

      [(#REM) Menu rubriques et Articles dans la meme rubrique ]
      
      <div class="rubriques">
              <ul>
              <!-- exclusion des rubriques invisibles -->
              <BOUCLE_somm_exclure_rubrique(RUBRIQUES) {racine} {titre_mot=invisible} {doublons}>
              </BOUCLE_somm_exclure_rubrique>
      
              <BOUCLE_rubriques(RUBRIQUES) {racine} {par num titre, titre} {doublons}>
                      <li>
                              <a href="#URL_RUBRIQUE"[ class="(#EXPOSE)"]>#TITRE</a>
                                 <!-- affichage des articles si on est en rubrique active -->
                                 [(#EXPOSE|=={on}|?{' ',''})
                                   <INCLURE{fond=inc/list-articles}{id_rubrique} {id_article}>
                                 ]
                      </li>
              </BOUCLE_rubriques>
              </ul>
      </div> 
    • Merci mille fois pour cette contrib !!!! j’avais commence a desesperer.
      J’utilise 1.92d et la syntaxe  !id_mot=5 ne marche toujours pas.

    • Loiseau2nuit

      Normal !

       !id_mot=5 ne marche toujours pas.

      Essaie avec id_mot !=5 et ca devrait mieux fonctionner déjà ;)

    • Oui, j’avais deja essaye cette syntaxe, ca ne marche pas non plus.
      En fait, je faisais allusion a cette contrib qui l’utilise :
      http://www.weblog.eliaz.fr/article36.html

    • merci pour cette solution !

      j’avais exactement le même problème : j’avais mis la boule exclure à l’intérieur du « B_articles » de la boucle articles non exclus.
      pb résolu en mettant la boucle exclure au dessus du « B_articles »...

    Répondre à ce message

  • 2

    Bonjour,

    J’ai beau retourner dans tous les sens, je ne règle mon problème, qui est le suivant :

    Pour exclure une rubrique, j’utilise cette boucle <BOUCLE_secteurs(RUBRIQUES) {racine}{id_rubrique!==^(5|16|18)$} {par titre}>

    La rubrique est identifiée par son numéro.

    Par contre, dans certains cas, je souhaite conserver la rubrique, mais exclure seulement les sous rubriques de cette même sous rubrique, mais par mot clé.

    Ci-joint le menu complet

    <BOUCLE_secteurs(RUBRIQUES) {racine}{id_rubrique!==^(5|16|18)$} {par titre}>
    	<li<BOUCLE_smenr(RUBRIQUES){id_parent}{0,1}> class="smenu"</BOUCLE_smenr>><a href="#URL_RUBRIQUE"><font color="#FF0000"><span style="text-decoration: none">[(#TITRE|supprimer_numero)]</span></font></a><font color="#FF0000">
    	</font>
      	<B_rubriques>
    		<BOUCLE_rubriques(RUBRIQUES) {id_parent} {par titre}>
    		<li<BOUCLE_smen(RUBRIQUES){id_parent}{0,1}>class="smenu"</BOUCLE_smen>></b><a href="#URL_RUBRIQUE"><font size="2"><span style="text-decoration: none">[(#TITRE|supprimer_numero)]</span></font></a><b>
    		<BOUCLE_sous_rubriques(BOUCLE_rubriques)> </BOUCLE_sous_rubriques></li><//B_sous_rubriques>
      	</BOUCLE_rubriques>

    Merci de m’aider

    • Tu peux utiliser la même technique que celle présentée ici mais sur des rubriques :

      -  tu places une ou plusieurs boucles RUBRIQUES avec un critères doublon qui vont choisir les rubriques à éliminer.

      Si tu souhaites éliminer celles qui incorporent un mot clé tu ajoute ce mot clefs comme critère.

      Si ces rubriques sont uniquement des sous rubriques il faut aussi ajouter l’id_parent.

      -  Ensuite tu as ta boucle RUBRIQUES d’affichage qui intègre aussi ce doublon pour ne pas afficher les rubriques précédemment choisies.

      a+

    • Je te remercie pour ta réponse, mais j’ai complètement échoué, tant pis, je vais utiliser la technique qui m’est habituelle, à savoir exclure la rubrique par <BOUCLE_secteurs(RUBRIQUES) racineid_rubrique !==^(5|2|3|4)rajouter le nom de la rubrique hors menu, faire un lien pour les sous rubriques.

      Quand je serais meilleur dans le langage des boucles ...... on verra

      Merci et @+

    Répondre à ce message

  • 1

    Bonjour, Je souhaiterais appliquer l’exclusion selon un mot clé à un forum, ne maîtrisant pas les boucles, je tourne en rond depuis qq semaines. Je vous explique mon pb. : Je souhaite afficher dans le forum que les messages auxquels il y a eu une réponse. J’utilise pour ça un mot clé « validé » qu’il est possible de relier à un message. Comment donc afficher le message parent sachant qu’il n’est pas possible de le relier à un mot clé. Pour résumer je souhaite afficher un message (qui dans mon cas ce sont des questions) qu’un fois qu’un modérateur a répondu à ce message en le validant (avec le mot clé validé). Merci d’avance.

    • Olivier G.

      Ca me semble bien compliqué ton histoire, tu ferais mieux de demander sur la ML spip@rezo.net qu’on débrousaille tout ça.

    Répondre à ce message

  • Bonjour, Je souhaiterais appliquer l’exclusion selon un mot clé à un forum, ne maîtrisant pas les boucles, je tourne en rond depuis qq semaines. Je vous explique mon pb. : Je souhaite afficher dans le forum que les messages auxquels il y a eu une réponse. J’utilise pour ça un mot clé « validé » qu’il est possible de relier à un message. Comment donc afficher le message parent sachant qu’il n’est pas possible de le relier à un mot clé. Pour résumer je souhaite afficher un message (qui dans mon cas ce sont des questions) qu’un fois qu’un modérateur a répondu à ce message en le validant (avec le mot clé validé). Merci d’avance.

    Répondre à ce message

  • Bonjour,
    Je souhaiterais appliquer l’exclusion selon un mot clé à un forum, ne maîtrisant pas les boucles, je tourne en rond depuis qq semaines.
    Je vous explique mon pb. :
    Je souhaite afficher dans le forum que les messages auxquels il y a eu une réponse.
    J’utilise pour ça un mot clé « validé » qu’il est possible de relier à un message.
    Comment donc afficher le message parent sachant qu’il n’est pas possible de le relier à un mot clé. Pour résumer je souhaite afficher un message (qui dans mon cas ce sont des questions) qu’un fois qu’un modérateur a répondu à ce message en le validant (avec le mot clé validé).
    Merci d’avance.

    Répondre à ce message

  • 1

    Juste une chose que je ne comprends pas .... pourquoi l’écriture «  »

    ne fonctionnes pas ? J’essaye et ça ne marche pas. Pourtant l’opérateur != me semblait de loin le plus pertinent pour ce type d’opérations....

    Merci pour ta contrib.

    • le critère {titre_mot!=restreint} fonctionne seulement sur l’ensemble des objets (ici rubriques) qui ont un mot-clé, et pas sur la totalité des objets.

      NB : il faut encadrer les morceaux de code par la balise <code>, sinon, ils sont interprétés par le navigateur et pas affichés.

    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 :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

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