var Phenix = function () {
Troll du Web depuis 1996

Moteur de recherche


Un moteur de recherche dans les catégories #Wordpress

Avoir un petit moteur de recherche pour les articles d’une catégorie Wordpress est en fait assez simple, pas besoin de ce lancer dans une chasse aux plugins.

Cela ne demande qu’un petit formulaire à mettre dans le template de catégorie.
Si vous n’avez pas envie de l’avoir dans toutes les catégories, vous pouvez simplement créer un template category-(slug ou ID).php.

  1. <form action="./" method="get">
  2. <input name="search" type="text" value="<?php echo $_GET['search']; ?>" placeholder="Recherche" />
  3. <input type="submit" value="Recherche"/>
  4. </form>

Et ensuite une petite WP_Query qui va faire tout le boulot :

  1. <?php
  2. $args = array(
  3. 's' => ($_GET['search']) ?: null, // Un opérateur Elvis, parce que c'est cool !
  4. 'cat' => $cat // L'ID de la catégory
  5. );
  6. $query = new WP_Query( $args );
  7.  
  8. while ( $query->have_posts() ) : $query->the_post();
  9. get_template_part( 'content', 'single' ); // A vous d'avoir un template pour afficher tout ça hein !
  10. endwhile;
  11. wp_reset_postdata();

Rien de sorcier donc, et surtout pas de faille de sécurité plugin usine à gaz d’installer pour faire ce formulaire.


Utiliser le critère {recherche} de #SPIP avec PHP

Les boucles SPIP possèdent un mécanisme de recherche particulièrement utile. On utilise le critère recherche.

Cela permet de faire des recherches sur n’importe quel objet SPIP et d’avoir des résultats un peu plus précis qu’un simple LIKE sur une requête SQL.

J’ai découvert qu’on pouvait également utiliser ce système en dehors d’une boucle, avec un peu de PHP :

  1. <?php
  2. $prepare_recherche = charger_fonction('prepare_recherche', 'inc');
  3. list($rech_select, $rech_where) = $prepare_recherche(
  4. _request('recherche'), // Le terme recherché
  5. $objet // L'objet dans lequel on recherche
  6. );

$rech_where contient un WHERE sql qui peut être utilisé dans une requête. Il ne faut juste pas oublie la jointure sur la table spip_resultats :

  1. <?php
  2. // On fait la requête SQL qui va bien
  3. $recherche = sql_allfetsel('*', 'spip_articles INNER JOIN spip_resultats as resultats ON resultats.id=spip_articles.id_article', $rech_where);

Et voilà !