Dans une boucle articles faire un ET logique sur les critères de mot clés

Criteres avec un ET sur des mots clés

Autrement dit, rendre cela possible :

<BOUCLE_essai(ARTICLES){id_mot=11}{id_mot=14}>
#TITRE ;  
</BOUCLE_ essai >

Essai de solution :

Dans cette solution il s’agit de trouver les articles qui ont en commun des mots clés, sachant que ces mots clés se trouvent dans des groupes de mots clés différents. (Je sens déjà que certains grincent des dents mais cela correspond à l’utilisation que je souhaite en faire).
En clair, je veux récupérer la liste des articles qui ont les mêmes mots clés dans n groupe de mot clé mais il faut pour cela qu’il y est au moins un mot clé choisi pour chaque groupe de mot clés.

Dans la page en question il s’agit de recevoir les mot clés par url ou post.
Le premier mot clé sera rangé dans un id_mot (autant utiliser SPIP et ses boucles efficaces).
Les suivants seront sous la forme id_mot2 , id_mot3 ...
Le nombre ne semble pas être limité.
Pour ma part j’en fais 4.

Le script est le suivant (voir les remarques à l’interieur du script pour des explications) :

<?php
        <?$mots_cle1=array();
        // trouve tous les articles ayant id_mot mais ausii dans id_mot1 selectionné et mettre dans tableau $mots_cle1
        // le id_mot1 fait parti du grp de mot clé 9 pour l exemple
        <BOUCLE_art1(ARTICLES){id_mot}>
                $mots_cle1[#ID_ARTICLE] = array(<BOUCLE_mots1(MOTS){id_article}{id_groupe=9}{", "}>'[(#ID_MOT|texte_script)]'</BOUCLE_mots1>);
        </BOUCLE_art1>
        // range dans un tableau
        $list_art_cle1 = array();$j=0;
        // dans le tableau mots_cle1 contenant les articles avec id_mot ET tous les mots clés du grp 9
        // cherche l'article avec en particulier le mot clé id_mot1
                foreach ($mots_cle1 as $cle => $element)
                        {
                                $key = (array_search($id_mot1 , $element));
                                if ($key === false)
                                {
                                // permet une verif
                                //echo "il n'y pas d'id dans cette ligne = ".$key."<br>";
                                }
                                else 
                                {
                                //permet une verif
                                //echo "id à la ligne = ".$key."<br>";
                                        if (array_key_exists('0', $element))
                                                {
                                                $list_art_cle1["$j"] = $cle;$j++;
                                                } 
                                }
                        }                
                 // pour une vérif
                 //echo '<pre> annee<br>';
                 //print_r($list_art_cle1);
                 //echo '</pre>';

?>

On peut donc faire autant de fois que nécessaire ce script en changeant id_mot1 par id_mot2 ainsi que tous les indices 1 en 2 puis 1 en 3 autant de fois qu’il y a de ET.

On récupère ainsi les tableaux et on trouve ce qu’ils ont en commun : les articles tant cherchés.

<?php 
                // la fonction suivante permet de recuperer les articles communs aux tableaux precedement créés
                // exemple sur 3 tableaux
                $intersec = array_intersect ($list_art_cle1 , $list_art_cle3 , $list_art_cle3);
                // affichage des articles concernés par le ET sur les mots clés
                foreach ($intersec as $element)
                {
                        $SQL ="SELECT * FROM spip_articles WHERE id_article='" . $element . "' ";
                        $res = mysql_query($SQL);
                        while($valeur=mysql_fetch_array($res)) 
                        {
?>
            <a href="article.php3?id_article=<? echo $valeur['id_article']; ?>"><? echo $valeur["titre"]; ?></a> <BR>
<?php
                        }

                }
?>

En esperant que cette contribution serve à certains.
Merci à l’équipe de SPIP.
Philippe Avi

Dernière modification de cette page le 16 novembre 2004

Discussion

Une discussion

  • 3
    robomatix

    Merci, cet ébauche de script m’a été trés utile !

    • Une autre solution beaucoup plus simple est la suivante (sauf erreur de ma part...) : Par exemple pour une intersection sur 3 mots clefs on écrit simplement :

      <BOUCLE_1(ARTICLES){id_rubrique}{titre_mot=mot1}>
      <BOUCLE_2(ARTICLES){id_rubrique}{id_article=#ID_ARTICLE}{titre_mot=mot2}>
      <BOUCLE_3(ARTICLES){id_rubrique}{id_article=#ID_ARTICLE}{titre_mot=mot3}>
      
      #TITRE
      
      </BOUCLE_3>
      </BOUCLE_2>
      </BOUCLE_1>

      Explication : on récupère tous les articles qui nous intéresse ayant le mot clef mot1, puis la deuxième boucle est une boucle qui ne prend qu’un élement, un des articles en question, mais qui le refiltre avec le deuxième mot,etc...

    • Merci ça a réglé mon problème.

      J’ai seulement changé le paramètre titre_mot par id_mot.


      #TITRE


      Je me demandais quand même s’il n’y a pas un autre moyen de passer plusieurs mots-clé en paramètre dans 1 boucle. Je gère un gros site avec plus de 2000 publications, les mots-clé me sont donc indispensables pour gérer autant d’information. J’aurais besoin de passer en paramètre 4 ou 5 mots-clé.

      Merci d’avance

    • En fait au départ c’était pour réaliser cela :
      http://article.gmane.org/gmane.comp.web.spip.user/53599/match= mais depuis les demandes de l’époque (février 2005) et spip ont bien évolués. C’est de la préhistoire. Ceci dit, le coup des tableaux imbriqué je trouvais çà ... élègant.

    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