WordPress Admin Search : étendre les résultats

Publié: 2021-01-20

Parfois, trouver du contenu sur un site Web peut être difficile. En tant qu'administrateur WordPress, plus il est facile de trouver le contenu que vous recherchez, mieux c'est. Heureusement, WordPress fournit une fonction de recherche sur la plupart des écrans d'administration que vous utiliserez (par exemple, l'écran Messages). Bien que cette fonction de recherche soit bonne, elle est néanmoins limitée à plusieurs égards.

Par exemple, si vous recherchez un message dans l'écran d'administration des messages, la fonction de recherche recherchera, par défaut, le texte de la requête de recherche dans le titre du message, l'extrait du message et le contenu du message, puis renverra ces résultats. Mais que se passe-t-il si vous souhaitez effectuer une recherche avec des mots-clés liés à un champ personnalisé ? Ces informations ne sont pas incluses dans les résultats de recherche du tableau de la liste des messages d'administration, ce qui peut être frustrant.

Dans un article précédent, nous avons appris comment ajouter un champ personnalisé dans nos types de publication. Voyons comment nous pouvons également inclure un champ personnalisé dans les résultats de recherche.

Étendre la requête de recherche dans la recherche de l'écran d'administration

Dans notre exemple travaillé sur les champs personnalisés, nous avons créé un champ personnalisé appelé "source" dans l'un de nos messages et inséré une valeur d'URL.

Si vous allez dans le tableau de la liste des articles et utilisez l'une de ces valeurs "source" dans la barre de recherche, vous n'obtiendrez aucun résultat car WordPress ne regarde tout simplement pas les champs personnalisés lors de la recherche par défaut.

Pour changer cela, nous devrons étendre le crochet d'origine fourni par WordPress pour la fonction de recherche. Le crochet que nous devons étendre est le pre_get_posts qui est inclus dans le fichier wp-includes/class-wp-query.php autour de la ligne 1779 à l'intérieur de la fonction get_posts .

La requête WordPress

Chaque fois que vous visitez une page, que ce soit dans la vue avant ou dans la zone d'administration, une chaîne de scripts de code s'exécute afin de créer l'objet WP_Query correspondant à votre requête, ainsi que ses propriétés.

Créons une vue temporaire de certaines des sorties de propriétés de la requête afin de comprendre quels changements se produisent dans l'objet WP_Query dans chaque cas.

Pour afficher la requête avant son exécution, nous ajouterons l'impression dans le crochet d'action pre_get_posts . Le filtre pre_get_posts se déclenche après la création de l'objet variable de requête, mais avant l'exécution de la requête réelle.

Dans le fichier functions.php de votre thème actif insérez ce bout de code :

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

Maintenant, si vous visitez l'écran d'administration des messages, les résultats de la query et de la query_var seront imprimés en haut.

Pour visualiser le code plus facilement, vous pouvez le copier et le coller dans un embellisseur PHP en ligne gratuit.

Le $GLOBALS['wp_query']->query (premier sorti) ressemblera à ceci :

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Dans le cas d'une recherche dans l'écran d'administration des messages par exemple, la sortie du tableau changera, y compris la chaîne de recherche. Si nous recherchons 'wordpress.org' par exemple, cela ressemblera à ceci :

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Assembler le code

Avec les informations ci-dessus à l'esprit, nous insérerons le code correct pour obtenir la fonction de recherche dont nous avons besoin. Pour ce faire, revenez au functions.php de votre thème actif et supprimez le code que vous avez inséré il y a quelques instants à l'étape précédente. Insérez ensuite le code ci-dessous :

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

L'étape suivante consiste à remplacer les $post_type et $custom_fields par des valeurs qui s'appliquent à vos besoins. Voyons ce que nous avons fait dans le code.

  • $post_type = 'post'; – Ici, nous définissons le type de publication que nous voulons rechercher.
  • $custom_fields = array("source",); – Ici, nous définissons le ou les champs personnalisés que nous voulons rechercher.

Parce que nous travaillons avec le crochet pre_get_posts , il est important de s'assurer dans notre code que nous appliquons notre extension de recherche personnalisée lorsque nous sommes sur la bonne page. Pour dire à WordPress d'afficher notre code dans des conditions spécifiques, nous utilisons des balises conditionnelles.

  • Le if ( ! is_admin() ) return; condition garantit que si nous ne sommes pas dans la zone d'administration, aucun de nos codes ne s'exécutera.
  • Le if ( $query->query['post_type'] != $post_type ) vérifie si nous travaillons sur le type de publication que nous avons défini dans la variable $post_type . Dans notre cas, post .
  • Le $search_term = $query->query_vars['s']; est l'endroit où nous conservons la chaîne de recherche dans une variable, puis nous la remettons à vide $query->query_vars['s'] = ''; sinon il ne trouvera rien.

Maintenant, avec ces mises à jour en place, si vous actualisez la dernière recherche, vous obtiendrez les résultats corrects. Dans notre cas, nous voyons la publication 'Post 1' dans les résultats qui inclut une entrée de champ personnalisé 'source' : 'https://dev. wordpress.org/reference/functions/add_post_meta/ '.

améliorer la recherche d'administrateur wordpress

Étendre la requête de recherche dans la vue de face

Maintenant que nous avons "corrigé" notre recherche d'administrateur, nous pouvons passer à l'amélioration de notre fonction de recherche frontale afin que les utilisateurs de notre site Web puissent également rechercher des champs personnalisés.

De la même manière qu'auparavant, la recherche d'administrateur ne donnait aucun résultat pour les champs personnalisés, la recherche frontale ne renvoyait aucun résultat pour les champs personnalisés.

Idéalement, nous voulons que les utilisateurs puissent rechercher ces champs. Dans cet exemple, nous avons un champ "source" personnalisé dans l'un de nos articles qui contient actuellement l'url "https://dev.wordpress.org/reference/functions/add_post_meta/". Si un utilisateur recherche "wordpress.org", ce message devrait apparaître dans les résultats. Découvrons comment faire cela.

Le code requis

Rendez-vous à nouveau dans votre fichier functions.php et copiez le code que vous avez collé précédemment. Maintenant, collez ceci directement sous ce code (vous avez donc deux copies de ce code dans functions.php ) Maintenant, changez le nom de la fonction dans ce deuxième lot de code en quelque chose comme extend_front_search . Ça devrait ressembler à ça:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Ensuite, nous devons supprimer le if ( $query->query['post_type'] != $post_type ) return; condition.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Nous avons juste besoin de maintenir la condition if( is_admin() ) return; pour s'assurer que le code ne s'appliquera qu'au front-end et nous sommes prêts à partir.

Une stratégie alternative

Une autre façon d'étendre la recherche WordPress pour inclure des champs personnalisés consiste à modifier la requête SQL.

La classe WP_Query vous y aide en la divisant en morceaux comme décrit autour de la ligne 2897 du fichier wp-includes/class-wp-query.php .

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

Comme nous l'avons mentionné précédemment dans les articles sur les champs personnalisés, toutes les données des champs personnalisés sont stockées dans la base de données dans la table 'postmeta' qui n'est pas incluse dans la recherche WordPress par défaut. Notre première étape consiste donc à joindre ces deux tables en utilisant le code ci-dessous :

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

Nous avons bien sûr utilisé le crochet posts_join car il filtre la clause JOIN de la requête.

Ensuite, nous utiliserons le crochet posts_where pour modifier la partie WHERE de la requête afin de répondre à nos besoins.

 function modify_where_clause( $where ) { global $pagenow, $wpdb; if ( is_search() ) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

Enfin et surtout, nous devons éviter les doublons. Pour ce faire, nous utilisons le crochet posts_distinct qui filtre la clause DISTINCT de la requête.

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

Voyons maintenant ce qui se passe dans le frontend si nous recherchons la chaîne "wordpress.org".

recherche wordpress sur le front-end

Comme prévu, les résultats sont corrects cette fois. La recherche WordPress a trouvé "post 1" car il contient le champ "source" avec la valeur "https://dev. wordpress.org /reference/functions/add_post_meta/

Types de publication personnalisés dans les résultats de recherche WordPress

Une autre chose que vous voudrez peut-être faire est de rendre les types de publication personnalisés consultables (si vous ne savez pas comment créer un type de publication personnalisé, assurez-vous de consulter nos articles à ce sujet ici).

Imaginons que nous ayons créé un type de publication personnalisé nommé "livres" et que nous souhaitions que ce type de publication apparaisse dans les résultats de recherche. Cette fois, nous n'avons pas à recréer la requête SQL, mais seulement à redéfinir les types de publication dans le crochet pre_get_posts , comme indiqué ci-dessous. Le code doit être replacé dans le fichier functions.php .

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

Ce que nous avons fait ici a été d'ajouter les types de publication souhaités à inclure dans les résultats de la recherche en tant qu'arguments du crochet post_type .

Si vous souhaitez exclure un type, supprimez-le simplement du tableau.

Conclusion

Améliorer la recherche sur votre site WordPress peut être très utile et vous faire gagner un temps considérable. Pour votre utilisateur final, il est également important qu'il puisse rechercher à la fois des types de publication personnalisés et des champs personnalisés. J'espère que les instructions ci-dessus vous ont donné un aperçu de la façon d'y parvenir sur votre propre site Web.