SearchWP Documentation

Consultez le guide d’installation, parcourez la base de connaissances, découvrez les nombreux hooks de SearchWP

Traiter les champs ACF pour indexer les données attendues

Parfois, après avoir ajouté des champs Advanced Custom Fields à la configuration de votre moteur SearchWP, les résultats attendus ne s'affichent toujours pas.

Cela est probablement dû à la manière dont ACF a stocké les données. Par exemple, examinons comment fonctionnent les champs Relationship. Après avoir configuré le champ, vous pouvez choisir un nombre quelconque d'entrées à sélectionner et à enregistrer avec votre article.

Champ ACF Relationship

Compte tenu de l'interface d'ACF, il est logique de s'attendre à ce que tous les titres des entrées choisies deviennent consultables, mais ce n'est pas le cas !

ACF ne stocke que les identifiants des articles des entrées choisies et c'est ceux-là que SearchWP indexe. Cependant, ce n'est pas très utile pour les visiteurs de votre site.

Heureusement, SearchWP rend extrêmement facile la modification de la manière dont ces données sont indexées. Au lieu de stocker les identifiants des articles tels qu'ils apparaissent dans l'enregistrement des données ACF, nous pouvons indiquer à SearchWP d'indexer le Titre (ou tout autre élément d'ailleurs !).

Voici à quoi cela ressemble en pratique :

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
/**
* Tell SearchWP to index the Title from a Relationship ACF field instead of the post ID
*/
add_filter( 'searchwp\source\post\attributes\meta', function( $meta_value, $args ) {
$acf_field_name = 'read_next'; // The ACF Relationship field name.
// If we're not indexing the Read Next field, return the existing meta value.
// This logic also works for sub-fields of an ACF field as well.
if ( $acf_field_name !== substr( $args['meta_key'], strlen( $args['meta_key'] ) - strlen( $acf_field_name ) ) ) {
return $meta_value;
}
// We're going to store all of our Titles together as one string for SearchWP to index.
$content_to_index = '';
if ( is_array( $meta_value ) && ! empty( $meta_value ) ) {
foreach ( $meta_value[0] as $acf_relationship_item ) {
if ( is_numeric( $acf_relationship_item ) ) {
// ACF stores only the post ID but we want the Title.
$content_to_index .= ' ' . get_the_title( absint( $acf_relationship_item ) );
// If you want to index anything else, you can append it to $content_to_index.
}
}
}
// Return the string of content we want to index instead of the data stored by ACF.
return $content_to_index;
}, 20, 2 );

Lorsque votre index est reconstruit à l'aide du bouton Reconstruire l'index dans l'onglet Moteurs des paramètres de SearchWP, l'indexeur de SearchWP exécutera le hook ci-dessus lors de l'indexation du champ ACF et, au lieu d'indexer les identifiants des articles tels qu'ACF les a stockés, il remplacera ces identifiants par le Titre de chaque entrée.

Vous pouvez ajuster le hook pour indexer les données de votre choix, pas seulement le Titre !

Un autre exemple serait de personnaliser ce que SearchWP indexe pour un champ ACF Select. Par défaut, ACF stocke/récupère uniquement la valeur du champ Select, mais vous voudrez peut-être permettre à vos visiteurs de rechercher également par le label du champ. Nous pouvons utiliser le même hook pour faire exactement cela :

<?php
// Tell SearchWP to index both value and label from ACF Select field.
add_filter( 'searchwp\source\post\attributes\meta', function( $meta_value, $args ) {
$acf_field_name = 'state'; // ACF Select field name.
if ( $acf_field_name !== substr( $args['meta_key'], strlen( $args['meta_key'] ) - strlen( $acf_field_name ) ) ) {
return $meta_value;
}
if ( ! is_array( $meta_value ) ) {
$meta_value = [ $meta_value ];
}
$acf_field_object = get_field_object( $acf_field_name, $args['post_id'] );
// Append the Select label to the Select value.
if ( isset( $acf_field_object['choices'] ) ) {
foreach ( $meta_value as $key => $val ) {
if ( isset( $acf_field_object['choices'][ $val ] ) ) {
$meta_value[ $key ] .= ' ' . (string) $acf_field_object['choices'][ $val ];
}
}
}
return $meta_value;
}, 20, 2 );

Créez dès aujourd'hui une meilleure expérience de recherche WordPress

Ne perdez plus jamais de visiteurs à cause de résultats de recherche inutiles. SearchWP rend la création de votre propre recherche WordPress intelligente rapide et facile.

Get SearchWP Now
Icône de moteurs de recherche multiples