Mettre en place un filtre de recherche en fonction d’une catégorie ou d’un custom post type
Cette astuce montre la démarche à suivre pour créer un formulaire de recherche avec un filtre par catégorie ou par Custom Post Type.
Si vous souhaitez permettre à vos visiteurs de faire une recherche en fonction d’une catégorie ou d’un Custom Post Type via une liste déroulante, alors wp_dropdown_categories()
ne conviendra pas.
La solution consiste à créer un formulaire de recherche et de modifier le comportement des résultats à l’aide du filtre pre_get_posts
.
Ajout du formulaire de recherche
Pour commencer, on doit créer notre propre formulaire de recherche comme ci-dessous :
<form method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>"> <p> <label for="s">Mots clés : <input type="text" name="s" id="s" /> </p> <p> <label for="myselect">Catégorie : <select id="myselect" name="search"> <option value="">Tout le site <option value="cat1">Catégorie 1 <option value="cat2">Catéogorie 2 <option value="book">Livres </select> </p> <p> <input type="submit" class="submit" name="submit" id="searchsubmit" value="Valider" /> </p> </form>
Dans notre exemple, cat1
et cat2
sont des catégories, tandis que book
est un Custom Post Type.
Modifier les résultats de la recherche
Ensuite pour modifier les résultats retournés pour la recherche, il suffit d’ajouter le code suivant dans votre fichier functions.php
présent à la racine de votre thème :
add_filter('pre_get_posts','custom_search_filter'); function custom_search_filter( $query ) { // Si on est entrain de faire une recherche if ( $query->is_search ) { switch( $_GET['search'] ) { case 'book': $query->set( 'post_type', 'book' ); break; case 'cat1': $query->set( 'category_name','cat1' ); break; case 'cat2': $query->set( 'category_name','cat2' ); break; } } return $query; }
Vous voilà désormais avec une recherche fonctionnant avec un filtre par catégorie et par Custom Post Type.
45 Commentaires
Thank u
Merci pour cette astuce qui permet d’augmenter l’ergonomie de l’outil recherche.
une super astuce…. vraiment pratique
Merci
pouvez-vous m’aider à faire ceci mais plutôt à mettre en place un filtre de recherche en fonction d’un lieu et non d’une catégorie.
A quoi correspond ce “lieu” ? un champ personnalisé ? Si le “lieu” n’est pas une catégorie, l’astuce sera plus complexe.
afficher une recherche correspondant à un lieu préalablement choisi dans une liste décroulante.
Merci pour la réponse, mais je ne suis pas plus avancé :/ Ce lieu est stocké où ? Dans un champ personnalisé ? Une catégorie ? etc…
oui c’est un champ que quelqu’un aura rempli dans un formulaire pour dépose une petite annonce.
cp_country
Désolé d’insisté, mais c’est quoi cp_country ? Le champ d’une autre table, un champ personnalisé ?
Bonjour, voila un le même type de recherche que je cherche à effectuer.
Le cp_country est un meta_key de la table wp_postmeta.
Un contrôle sur l’existence du paramètre $_GET[‘search’] serait bienvenu… zocahou
…isset($_GET[‘search’])…
@Tilap : Il me semble que l’on peut s’en passer étant donné que l’on check si on se trouve sur une recherche avec $query->is_search. Si $_GET[‘search’] n’existe pas, on ne passerai pas avec la condition du $query->is_search.
A tester tout de même.
Ca marche pas.. Impossible de rentrer dans le $_GET ??
Si ça ne fonctionne pas, c’est que vous avez mal configuré quelque chose.
Pouvez-vous nous copier votre via pastebin.com ?
Merci pour cette réponse rapide. Je suppose que vous voulez que je copie le code? Je peux le faire mais je vous assure que c’est un copié-collé de ce qui est au dessus dans l’article car j’ai un Custom_Post_type book comme dans l’exemple. Est ce que ca peut etre du à la mise à jour de wordpress 3.5? Mon array $_GET est vide !!!
Non, WP 3.5 à rien à voir avec ce code.
Je pense que le mieux est de nous fournir 2 liens pastebin avec le code html du formulaire et la partie PHP du fichier functions.php.
D’accord, alors voici la function :
http://pastebin.com/EhJutXz5
et voici le formulaire :
http://pastebin.com/cdv47qqW
Remarque : Si j’effectue “$query->set();” en dehors du switch directement dans le if, cela fonctionne ? Mon problème vient vraiment de mon $_GET je crois.. Merci encore une fois pour votre aide
J’ai bien les variables de mon url de départ mais j’ai une redirection 301 (vers /site/search/keyword). Est ce que c’est à ce moment la que je perds mes variables $_GET? Et si oui, comment je peux faire?
@Mikl : cette redirection 301 provient de quoi ?
De la réécriture d’url, je pense.. J’ai ceci : “/site/?s=keyword&search=book&submit=Recherche” qui devient “/site/search/keyword” .
@Mikl : Dans ce cas c’est tout à faire normal que la variable $_GET[‘search’] ne soit plus disponible car elle ne doit pas passé dans la réécriture.
C’est quoi le code qui a permit de faire cette redirection ?
Merci pour le temps passé sur mon cas. Oui, c’est bien ce qui me semblait mais j’espérais que la fonction fasse le travail avant la redirection.
Je ne sais pas trop d’ou vient cette réécriture, ça doit être les permaliens de mon thème et de wordpress. J’ai ceci dans mon .htaccess :
# BEGIN WordPress
RewriteEngine On
RewriteBase /site/
RewriteRule ^index.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /site/index.php [L]
# END WordPress
La réécriture du fichier htaccess ne concerne pas celle de la recherche.
Il y a obligatoirement un code dans le fichier functions.php qui fait la redirection car défaut l’url d’une recherche est http://example.com/?s=toto
Ahahah je viens de trouver le problème grâce à ton aide précieuse. J’utilise le Thème Roots et j’ai trouve ceci dans le fichier cleanup.php :
Reste plus qu’à trouver une solution propre :)
C’est bon, j’ai trouvé la solution. Merci beaucoup
Bonjour, et merci pour cette astuce bien pratique !
Elle fonctionne si bien que j’ai voulu m’en servir pour filtrer par année mes résultats de recherche.
J’ai suivi le même principe malheureusement, le filtre ne filtre pas et sort quand même les articles de toutes les années correspondants à ma recherche … Pourtant le paramètre ‘year’ prend bien la valeur voulue dans la requête. Auriez-vous une idée ?
Bonjour Jonathan.
Je suis en train de réaliser un WordPress pour mon entreprise. Malheureusement je suis une grosse novice en programmation et j’ai absolument besoin d’un filtre qui trierait les recherches d’évènements par lieux (ville) grâce à un menu déroulant.
Le nom des villes se trouve dans le texte corps de l’évènement et pour gérer mes events j’utilise all-in-one event (car il contenait d’office le filtre par catégorie d’évènements, ce dont j’avais besoin aussi.
Mes questions sont donc: est-ce que cette manoeuvre est faisable? Si oui il y a une solution pour l’intégrer plutôt facilement dans mon WP? (j’ai commencé à programmé un peu hier et avant hier mais rien d’exceptionnel).
Merci pour ton aide :)
@ Gwennite: Je ne connais pas du tout le plugin all-in-one event. Je ne vais pas pouvoir être d’une grande aide :/
Bonsoir,
Je voudrais savoir à quel endroit faut-il mettre le code “Ajout du formulaire de recherche”
Merci
@ sylvainbr: C’est ça à vous de décider. Ça peut-être dans votre header ou votre sidebar. En gros, c’est à l’endroit où vous souhaitez l’afficher.
Bonjour,
J’ai un gros problème, j’ai voulu utiliser cette astuce sur le thème que je développe
en local sur wamp, je n’y suis pas parvenu alors j’ai effacé le formulaire de recherche de mon header et la fonction dans fonction.php pour faire machine arrière.
Malheureusement à présent il m’apparaît dans l’admin de wordpress ce message ” Warning: call_user_func_array() expects parameter 1 to be a valid callback, function ‘custom_search_filter’ not found or invalid function name in C:wampwwwwordpresswp-includesplugin.php on line 507″
Je suis un peu d’espéré, pourriez vous m’aider?
Je vous remercie d’avance.
@Pierre: Vous avez oublié de supprimer cette ligne ;)
J’ai essayé ce code et j’ai l’erreur suivante quelque soit la recherche:
Accès interdit!
Vous n’avez pas le droit d’accéder à l’objet demandé. Soit celui-ci est protégé, soit il ne peut être lu par le serveur.
Si vous pensez qu’il s’agit d’une erreur du serveur, veuillez contacter le gestionnaire du site.
Error 403
127.0.0.1
02/02/2014 23:22:38
Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
————————————–
D’autre part je ne sais pas ci c’est le bon code que je dois utiliser.
j’ai utiliser la fonction ‘function register_documentation’ pour créer un custom poste type.
Je voudrais que ma recherche ne puisse pas rechercher dans ce custom poste type.
Est-ce possible de faire cela?
Je m’étais rendu compte de cet oubli quelques temps après l’envoi de mon message de désespoir.
Quel âne je suis!
En tous cas merci à vous de m’avoir répondu.
Votre site est fantastique!
je serai intéressé pour faire une recherche multi critère, c’est à dire d’un côté avec les catégories, et d’autres part avec les départements de France ..
j’ai testé votre code, question affichage, c’est nickel, par contre, en testant les recherches, rien ne fonctionne … que dois je modifier dans functions ?
@nemesis2508 : Le code est à adapter en fonction de vos catégories. Ne les connaissant pas, je ne peux pas vous aider.
Vraiment de bonnes ressources, comme d’habitude. Une idée de comment utiliser les filtres par catégorie en restant sur la même page ?
Par exemple on a une page avec tous nos articles, et on a un menu déroulant avec nos différentes catégories et lorsque l’on en sélectionne une, les articles de la catégorie sélectionnée restent, les autres disparaissent .
Bonjour,
Tout d’abord merci pour ton article qui m’a fait avancer rapidement dans la création de mon moteur de recherche multicritère.
J’ai cependant 1 question :
j’ai 3 catégories dans mon moteur : département, types de locaux, location / vente.
Quand je lance une recherche du type :
Var + bureaux + location, la page de résultat me renvoie tous les articles ayant au moins une de ces catégories. Un article du département du Vaucluse va donc ressortir s’il est présent dans la catégorie “location”.
Comment fait-on pour que le moteur prenne en compte le choix des 3 catégories et que le ou les filtre(s) se fassent ?
Je précise que j’ai seulement des notions en programmation, c’est donc peut-être une broutille pour les experts :-).
Merci d’avance
comment faire pour faire un filtre qui filtre des champs personnalisés dans un custom post type?
Bonjour,
je voudrais savoir comment on fait pour faire exactement la meme chose mais avec des champs personalisés?
Bonjour,
J’aimerai mettre une barre de recherche avec 2 types de recherche
la 1 ère serait une recherche sur les catégories
la 2ème sur les villes
Je souhaiterai le mettre en page suivante
http://www.durablimmo.fr/carte-de-france/
Je n’ai réussi faire fonctionner le code, y’a un truc qui m’échappe.
Merci d’avance.
Voila
J’ai testé cela marche bien chez moi lorsqu’il y a une catégorie !
Par contre est-ce possible d’avoir plusieurs filtres ? exemple filtre n°1 les âges, filtre n°2 les activités ?
Bonjour Jonathan,
Pour palier à la recherche des fichier PDF maintenant j’utilise le plugin Google searche sur notre site. A priori il n’est pas possible d’utiliser la recherche dans des catégorie comme votre code le permet. A votre avis est-il possible de le faire ou pas.
Bonjour,
merci pour ce super code ! c’est exactement ce que je recherchais.
Par contre à la place de “tout le site” je voudrais mettre “tous les prestataires” et si la personne ne choisis pas de catégorie, la recherche se fasse sur tous les custom poste types
auriez vous une idée ?
Merci d’avance