Tout savoir sur WordPress

Étendre la recherche à certains champs personnalisés

Cette astuce permet d’étendre la recherche en fonction de la valeur d’un champ personnalisé.

Voici une astuce qui permet de prendre en compte la valeur d’un champ personnalisé dans la recherche de WordPress.

Par exemple, si vous avez créé un champ personnalisé “sous_titre”, il serait intéréssant de le prendre en compte pour les résultats de la recherche.

Copier le code ci-dessous dans le fichier functions.php présent à la racine de votre thème :

add_filter('pre_get_posts', 'gkp_search_sous_titre');
function gkp_search_sous_titre( $query ) {

    if ( !is_admin() && $query->is_search ) {
	$query->set('meta_query', array(
		array(
		    'key' => 'sous_titre',
		    'value' => like_escape( $query->query_vars['s'] ),
		    'compare' => 'LIKE'
		   )
	    ));
    }
}

Le hook pre_get_posts va prendre l’objet $query avant qu’il soit éxecuté pour le modifier. C’est là qu’on lui dit de prendre en compte la valeur du champ personnalisé “sous_titre” à l’aide de meta_query.

Pour personnaliser cette astuce avec votre propre champ personnalisé, vous devez modifier la valeur de l’index “key” avec le nom de votre champ.

Cet article a été mis à jour il y a 4300 jours - Il n'est peut être plus à jour !

Article écrit par Jean-David

9 Commentaires

  1. Ho excellente idée et très bon code.

    Tu pourrais poster le même pour ceux qui veulent le faire pour 2 champs ? Car si on duplique le code, on va bien sur écraser le premier champ, je te laisse faire ? Sinon hésite pas :]

  2. Je n’ai pas du tout testé et je dis peut être n’importe quoi, mais je pense qu’en mettant

    array(
        'key' => 'sous_titre',
        'value' => like_escape( $query->query_vars['s'] ),
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'un_autre_champ',
        'value' => like_escape( $query->query_vars['s'] ),
        'compare' => 'LIKE'
    )
    

    a tester ^^!

  3. Voici le code au complet avec la relation “AND” qui oblige à avoir les 2 champs, si tu veux un des 2, mets “OR”.

    function search_sous_titre( $query ) {
        if ( !is_admin() && $query->is_search ) {
    	$query->set('meta_query', array( 'relation' => 'AND',
    		array(
    		    'key' => 'sous_titre',
    		    'value' => like_escape( $query->query_vars['s'] ),
    		    'compare' => 'LIKE'
    		 ),
    		 array(
    		    'key' => 'un_autre_champ',
    		    'value' => like_escape( $query->query_vars['s'] ),
    		    'compare' => 'LIKE'
    		)
    		));
        }
    }
    add_filter('pre_get_posts', 'search_sous_titre');
    

    A bientot !
    ps : non testé, mais mon cerveau a validé lol

  4. Il serait extrêmement intéressant de pouvoir attribuer un poids aux champs que l’on ajoute dans la recherche – du moins, si la recherche WP est bien une recherche Fulltext. J’avoue que ma connaissance du système est encore incomplète ^^’

  5. @Romain : Pour de la recherche FullText, je crois que le plugin Relevanssi permet de faire cela. A vérifier tout de même !

  6. Je ne comprend pas pourquoi mon code ne fonctionne pas et bloque ma recherche :

    add_filter('pre_get_posts','gkp_search_filter');
    function gkp_search_filter($query) {
        if ($query->is_search)
            $query->set('post_type',array('book'));
    
        if ( !is_admin() && $query->is_search ) {
            $query->set('meta_query', array(
            array(
                'key' => 'Book_author',
                'value' => like_escape( $query->query_vars['s'] ),
                'compare' => 'LIKE'
            )
          ));
       }
    }
    
  7. Bonjour. Cette fonctionnalité devait être intéressante mais je n’arrive pas à trouver son équivalent pour 2017, en effet like_escape est dépréciée depuis WP 4.0 et la recherche d’une fonction de remplacement – en l’occurence $wpdb->esc_like – n’a, chez moi, pas donné de résultats…