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.

Discussion

Aucune discussion

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