Selectionner les x derniers articles syndiqués suivant un mot clef

Si l’on syndique beaucoup de sites classés par mots clefs, comment obtenir la liste chronologique des 10 derniers articles de nos sites favoris parmi cet ensemble de sites ?

Supposons que nous syndiquions un grand nombre de sites de façon systématique, et que nous voulions afficher une liste des derniers articles parus sur nos sites « favoris ».

Pour ceux qui n’ont pas le temps : la solution, pour les autres, suivre les tentatives peut être instructif...

A priori, on se dit qu’il suffit d’associer le mot clef « favori » à nos site, d’ajouter un critère <tt><b>{titre_mot=favori} à une boucle et hop, le tour est joué.

pourquoi ce n’est pas si simple

C’est en fait plus compliqué. La documentation de la boucle SYNDIC_ARTICLES nous rappelle que l’on peut indiquer les critères {id_secteur}, {id_rubrique} et j’en passe, mais pas {titre_mot} ou {id_mot}.

On ne peut donc pas faire
<BOUCLEn(SYNDIC_ARTICLES){titre_mot=favori}>

Si l’on fait une première boucle pour selectionner les sites favoris

<BOUCLEn(SYNDIC){titre_mot=favori}>
<BOUCLEn(SYNDIC_ARTICLES)>

Deux problèmes :

  • les articles obtenus seront classés par sites (nous les voulons par date)
  • on ne pourra pas contrôler le nombre global d’articles à afficher.

Pour pouvoir selectionner {par date}{inverse}{0,10} il faudra avoir une boucle qui s’applique à l’ensemble des articles des sites favoris.
Il faudra donc au préalable exclure par une boucle ou une combinaison de boucles les articles syndiqués des sites non favoris en utilisant {doublons}

Avant SPIP 1.8

Problème, avant [SPIP 1.8] {doublons} ne s’applique pas aux articles syndiqués... Pour les versions antérieures, on ne pourra avoir qu’une solution approchée : une boucle sur l’ensemble des articles syndiqués, et pour chaque article trouvé, vérification s’il appartient à un site favori. On ne pourra pas contrôler exactement le nombre d’articles affichés.

<BOUCLE_articles_syndiques(SYNDIC_ARTICLES){par date}{inverse}>
<BOUCLE_sites_syndiques(SITES){id_syndic}{titre_mot=Espéranto}>
[- (#TITRE) <br>]
</BOUCLE_sites_syndiques>
</BOUCLE_articles_syndiques>

SPIP 1.8

Première idée : il faut exclure les articles liés aux sites qui n’ont pas le mot clef « Favori », puis faire une boucle sur tous les autres articles.

<BOUCLE_sites_syndiques_excl(SITES){titre_mot != Favori}>
<BOUCLE_articles_syndiques_excl(SYNDIC_ARTICLES) {doublons}>
</BOUCLE_articles_syndiques_excl>
</BOUCLE_sites_syndiques_excl>
<B_articles_syndiques>
<ul>
<BOUCLE_articles_syndiques(SYNDIC_ARTICLES) {doublons} {par date} {inverse} {0,10}>
  [<li>(#TITRE)</li>]
</BOUCLE_articles_syndiques>
</ul>
</B_sites_syndiques>

Ce qui ne donne pas le résultat voulu pour plusieurs raisons :

  • le critère {titre_mot != Favori} exclue l’ensemble des sites qui n’ont pas de mot clefs associés, il signifie parmis les sites qui ont au moins un mot clef, selectionne ceux qui ont un mot clef différent de Favori
  • du coup, si parmis nos sites favori certains ont un autre mot clef associé comme par exemple spip, logiciel libre, ... ils seront eux aussi selectionnés dans la première boucle et donc exclus !

Pour réaliser la négation {titre_mot != Favori} il faut en fait passer par une première boucle {titre_mot = Favori}{doublons} pour exclure nos site favoris et seulement eux de la boucle suivante...

Solution

Utilisation (massive) des doublons :

  • une première boucle sélectionne les sites favoris,
  • une seconde boucle passe en revue l’ensemble des autres sites, puis les articles syndiqués de chacun de ces sites.
  • enfin une troisième boucle nous permet de passer en revue tous les autres articles syndiqués : ceux qui sont liés aux sites « favori » !
<BOUCLE_sites_syndiques_gardes(SITES){doublons}{titre_mot = favori}>
</BOUCLE_sites_syndiques_gardes>

<BOUCLE_sites_syndiques_exclus(SITES){doublons}>
<BOUCLE_articles_syndiques_exclus(SYNDIC_ARTICLES) {id_syndic} {doublons}>
</BOUCLE_articles_syndiques_exclus> </BOUCLE_sites_syndiques_exclus>

<ul>
<BOUCLE_articles_syndiques(SYNDIC_ARTICLES) {doublons} {par date} {inverse} {0,10}>
  [<li>(#TITRE)</li>]
</BOUCLE_articles_syndiques>
</ul>

Nous résumons ici une réflexion sur la liste des utilisateurs de spip qui a permis grâce à Pierre Andrews d’aboutir à une solution au problème.

Dernière modification de cette page le 7 décembre 2006

Discussion

Une discussion

  • 2

    Merci, c’est ce que je cherchais.

    Cependant, un ’copier-coller’ de la ’solution’ génère une erreur (boucle non fermée). j’ai remplacé
    </BOUCLE_sites_syndiques> (avant dernière ligne)
    par
    </BOUCLE_articles_syndiques> et ça marche.

    • Voilà, j’ai corrigé, merci.

    • Bonjour,

      Comment modifier le code spip pour pouvoir associer un mot clef directement ?
      On peut déjà associer le critère rubrique, alors que ce n’est pas un champ de la table syndic_articles mais un champ de spip_syndic, on devrait pouvoir faire la même chose en modifiant le code pour associer directement un mot clef à la boucle SYNDIC_ARTICLES

    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