Afficher les 3 mots les plus associés aux articles des 10 derniers jours

Bonjour, je débute avec SPIP et souhaiterais extraire les mots clés « tendance » assignés au articles des 10 derniers jours. J’ai réussi à obtenir le résultat souhaité en SQL, mais il me semble plus pertinent d’utiliser la syntax SPIP.

Comme le montre la requête SQL ci-dessous, je souhaites:

  • les mots dont le id_groupe_racine = 9
  • les 3 mots les plus utilisés
  • parmi les articles des 10 derniers jours

En SQL, je fais comme ça:

        <BOUCLE_mots_tendances(MOTS)
          {where id_mot IN (

            -- 3 mots "Thématique" les plus utilisés parmi les articles des
            -- 10 derniers jours
            SELECT spip_mots.id_mot FROM spip_mots
            JOIN spip_mots_liens ON spip_mots.id_mot = spip_mots_liens.id_mot
            WHERE spip_mots.id_groupe_racine = 9
            AND spip_mots_liens.objet = "article"
            AND spip_mots_liens.id_objet IN (

              -- IDs des articles des 10 derniers jours
              SELECT spip_articles.id_article FROM spip_articles
              WHERE spip_articles.date >= DATE("now", "- 10 day")
            )

            -- Séléction des 3 mots les plus fréquents
            GROUP BY spip_mots_liens.id_mot
            ORDER BY COUNT(*) DESC
            LIMIT 3
            )}
        >

Mon équivalent SPIP bloque à ce stade (prématurèment):

        <BOUCLE_articles_10_j(ARTICLES){age<=10}>
          <BOUCLE_mots(MOTS){id_article}>
          </BOUCLE_mots>
        </BOUCLE_articles_10_j>

Je n’ai aucune idée de comment compter le nombre d’occurences d’un mot, ni d’en séléctionner les 3 plus fréquents.

Pourriez-vous m’aider à traduire cette requête et comprendre davantage le pouvoir des boucles ?

Cdt,
qenver

Salut,
Il faudrait regarder du côté des jointures en spip :

1 « J'aime »

Et aussi du côté du critère compteur du plugin bonux Le critère {compteur} de Bonux - SPIP-Contrib

1 « J'aime »

Tu peux déjà ajouter ici le critère {id_groupe=9} et le retirer du where sql.
Ou {id_groupe_racine=9} car tu as renommé le champ ?
Et imbriquer tes 2 boucles dans l’autre sens évitera d’en faire une 3eme peut être…

1 « J'aime »

Merci pour vos retours !

J’ai vainement essayé de transcrire ma requête en SPIP en utilisant des jointures, mais si je comprends bien il n’est pas possible d’utiliser certains critères dans les conditions de jointure (ex: {articles.age < 123}). Si je suppose bien, seul les critères qui concernent directement des champs de la base de données sont opérable ? (il n’y a pas de colonne age, donc pas possible)

Pour ce qui est du plugin Bonux, ça semble chouette, mais c’est sûrement trop pour ce que j’ai à réaliser. Bon à savoir que ça existe en revanche, merci !

Au final j’ai opté pour une solution « algorithmique » un peu différente (en piquant des bouts de code par ci par là)

#SET{nombre_de_mots, 3}
#SET{age_articles_en_j, 10}
#SET{mots_tendances,#ARRAY}

<BOUCLE_set_mots_tendances(MOTS){id_groupe_racine=9}>
  <BOUCLE_articles(ARTICLES){id_mot}{age<=#GET{age_articles_en_j}}>
    [(#SET{mots_tendances, #GET{mots_tendances}|array_merge{#ARRAY{prefix_mot#_set_mots_tendances:ID_MOT,#TOTAL_BOUCLE}}})]
  </BOUCLE_articles>
  </B_articles>
</BOUCLE_set_mots_tendances>


<!-- Affichage -->
<BOUCLE_get_mots_tendances(DATA){source tableau,#GET{mots_tendances}}{tri valeur}{inverse}{0,#GET{nombre_de_mots}}>
  #SET{id,#CLE|match{^prefix_mot(\d+)$,1}}

  <BOUCLE_affichage_mots(MOTS){id_mot=#GET{id}}>
    <a href="#URL_MOT">#TITRE</a>
  </BOUCLE_affichage_mots>
</BOUCLE_get_mots_tendances>

Pas optimal, mais j’ai pas 50 articles par jours donc ça va !
À plus :slight_smile: