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

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

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