[WordPress] Filtrer la recherche en choisissant le type de billets (Custom Post Type)

Depuis que j’ai introduit les Custom Post Types sur Websourcing, j’ai dans l’idée de proposer une recherche différentiée entre les billets « classiques » (les posts) et les billets de citation (ce que j’appelle « Sur le Web »).

La seule différence entre les deux requêtes serait d’introduire le critère « post_type », qui est un des critère de « The_Loop » (ou plus exactement de « WP_Query« ).

En fait c’est très simple à faire; imaginons que nous voulons proposer un formulaire de recherche dédié à un CPT « moncpt ». Il suffit de créer un un paramètre qui sera transmis dans le GET (ici custom-post-type). Il faut alors placer le code suivant du formulaire de recherche là où vous souhaitez pouvoir rechercher les CPT de type « moncpt » :

<form method="get" id="searchform" action="<?php bloginfo('home'); ?>/">
<input type="text" value="" name="s" id="s" />
<input type="hidden" name="custom-post-type" value="moncpt" />
<input name="submit" type="submit" value="Chercher" />
</form>

Par défaut, sa valeur vaut « moncpt » dans un champ caché, pour récupérer les billets de type « moncpt ». Mais vous pouvez multiplier les copies de ce code en changeant le type. Mieux, vous pouvez créer une combobox avec des choix, et dans ce cas modifier le template searchform.php de votre thème.

Pour afficher les résultats souhaités, il vous faut alors modifier le template de votre thème qui affiche les résultats. Dans la plupart des cas il s’agira de search.php.

Introduisez alors le code suivant, juste avant la boucle :

<?php
if(isset($_GET['custom-post-type']) && "otw" == $_GET['custom-post-type'] ) {
   $args = array( 'post_type' => 'moncpt' );
   $args = array_merge( $args, $wp_query->query );
   query_posts( $args );
}
else {
   $args = array( 'post_type' => 'post' );
   $args = array_merge( $args, $wp_query->query );
   query_posts( $args );
}
?>

Bien entendu on peut répéter ce code à l’envie, voire mixer plusieurs types de billets. A vous de voir.
Simple mais pratique.