Rechercher dans les articles syndiqués

SPIP ne permet pas de rechercher dans les articles syndiqués. Voici comment faire avec un peu d’astuce.

Cette contrib est l’évolution [1] d’une « bribe de code » que j’avais pondu il y a quelques temps. Son objectif est de pallier aux lacunes de SPIP concernant la recherche dans les articles syndiqués. SPIP permet la recherche dans les rubriques, brèves, articles mais pas les articles syndiqués.

Je construis un simple tableau dans le fichier recherche.php3 qui me récupère les articles selon le terme recherché. Plusieurs mots acceptés. Le truc avec les caractères bizarres, c’est juste pour gérer les accents. Les expressions régulières dans les requêtes servent à séparer correctement les mots :

$ma_recherche = rtrim(str_replace("+", " ", $_GET['recherche']));  
//suppression de moins de 3 caractères
$ma_recherche = preg_replace('@(.+?)\b[\w]{1,2}\b(.+?)@si', '\1 \2', $ma_recherche);
$ma_recherche = preg_replace(array("@[AÀÁÂÃÄÅaàáâãäå]@","@[OÒÓÔÕÖØoòóôõöø]@","@[EÈÉÊËeéèêë]@","@[Çç]@","@[IÌÍÎÏiìíîï]@","@[UÙÚÛÜuùúûü]@","@[ÿÑñ]@"), array("[aàáâãäå]","[oòóôõöø]","[eéèêë]","[Çç]","[iìíîï]","[uùúûü]","[ÿñ]"), $ma_recherche);
$mots = explode(" ",$ma_recherche);
$articles_syndiques_recherches = array();
for ($i = 0; $i < sizeof($mots); $i++) {
	
	$sql = "select titre,descriptif,url from spip_syndic_articles where statut = 'publie' and (titre regexp '[[:<:]]$mots[$i][[:>:]]' or descriptif regexp '[[:<:]]$mots[$i][[:>:]]') order by date desc limit 0,50";
	$res = spip_query($sql);
	while ($row = mysql_fetch_object($res)) {
		array_push($articles_syndiques_recherches, $row);
	}
}

Ensuite, je construis ma boucle pour le squelette :

<?php if ( sizeof($articles_syndiques_recherches)>0 ) { ?>
<div class="keypoint">
	<h2>Dans les articles syndiqu&eacute;s</h2>
	<ul>
		<?php foreach ($articles_syndiques_recherches as $v) { ?>
<li><a href="<?= $v->url ?>" title="<?= substr($v->descriptif,0,50) . ' ...' ?>"><?= surligner_mots($v->titre, $GLOBALS[recherche]) ?></a></li>
		<?php } ?>
	</ul>
</div>
	<?php } //endif ?>

Voilà. L’idéal serait de créer un VRAI critère de boucle pour cela. Peut-être dans une prochaine version ...

Pour l’installer écrasez votre fichier recherche.php3 à la racine.

recherche.php3

Note : ce système est un palliatif. Dans un environnement fortement sollicité, il est très peu efficient [2]. On peut le rendre efficace cependant en utilisant un système de cache externe à SPIP. Cette contrib est utile pour les squelettes de type sedna.

Notes

[1Avec des expressions régulières.

[2A cause de son accès permanent à la base de donnée.

Dernière modification de cette page le 22 septembre 2006

Discussion

Aucune discussion

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