Le blog de Nukleo

WordPress : limiter la recherche à certains types de posts

9 mai 2011 dans WordPress | 4 commentaires

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 !

Mots-clés : , ,

Vous avez aimé l'article ? Partagez-le : 

Commentaires

  1. John Francisco dit :

    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?

    • Erik dit :

      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 :)

  2. Cyril dit :

    Bonjour,
    Génial mais…du coup cela filtre aussi les recherches dans l’admin :(

    • Erik dit :

      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 :)