Par défaut, le moteur de recherche de WordPress cherche les termes demandés dans tous les types de posts publiés du site, à savoir : les articles (posts), les pages (post-type page), les custom posts etc… Dans certains cas de figure on pourrait souhaiter limiter la recherche à un seul type de post, ou la restreindre à certains types. Voici comment.
Functions.php
Il suffit d’ajout un tout petit bloc de code dans le fichiers functions.php :
// filtrage des recherches -> limite aux articles publiés function filtre_recherche( $query ) { if ( $query->is_search && !is_admin() ) { $query->set( 'post_type', 'post' ); } return $query; } // ajout du filtrage sur le hook 'pre_get_post' add_filter( 'pre_get_posts', 'filtre_recherche' );
Ce bout de code restreindra la recherche aux seuls articles (posts) publiés. Si l’on souhaite étendre la recherche à plusieurs types, il suffit de modifier légèrement la fonction :
// filtrage des recherches -> limite aux articles publiés, aux pages et à un custom post type function filtre_recherche( $query ) { if ( $query->is_search && !is_admin() ) { $query->set( 'post_type', array( 'post', 'page', 'custom-post-type' ) ); } return $query; } // ajout du filtrage sur le hook 'pre_get_post' add_filter( 'pre_get_posts', 'filtre_recherche' );
Vous l’aurez remarqué, seule la partie $query->set()
change : on lui passe un array des types de posts que l’on souhaite voir apparaître dans les résultats de recherche.
Pour en savoir plus
Rendez-vous sur le Codex de WordPress : la class WP_query (qui contient la propriété $query
) et le hook pre_get_posts
Happy coding !
Je comprend pas, l’un ou l’autre de ces deux codes font immédiatement planter mon thème.
y a-t-il une explication?
Bonjour John, désolé pour la réponse tardive…
A mon avis il doit s’agir d’un conflit avec un plugin ou un bout de code dans le fichiers functions.php.
Le mieux est de tester éventuellement sur une install clean de WP en local sans aucuns plugins ni fonctions dans functions.php. Si ça fonctionne – et ça devrait – réintroduire progressivement les fonctions et plugins jusqu’à trouver le coupable puis agir en conséquences :)
Bonjour,
Génial mais…du coup cela filtre aussi les recherches dans l’admin :(
En effet ! Pour corriger cela il faut modifier la condition de la fonction comme suit :
if ( $query->is_search && !is_admin() )
et tout devrait rentrer dans l’ordre. Je modifie l’article en conséquence, merci d’avoir indiqué ce petit defaut :)