SearchWP Documentation

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

Intercepter les recherches de champs de relation Advanced Custom Fields (ACF)

Advanced Custom Fields offre la possibilité d'ajouter un champ de recherche aux champs de relation :

Champ ACF Relationship

Par défaut, SearchWP n'interceptera pas ces recherches, mais en utilisant cet extrait, vous pouvez y parvenir :

<?php
function my_searchwp_acf_relationship_field_search( $args, $field, $post_id ) {
if ( empty( $args['s'] ) || ! class_exists( 'SWP_Query' ) ) {
return $args;
}
// Assume that the SearchWP engine to use is the defined admin search engine
// from SearchWP's engine settings.
$admin_engine = \SearchWP\Settings::get_admin_engine();
$engine_name = ! empty( $admin_engine ) ? $admin_engine : 'default';
$engine = new \SearchWP\Engine( $engine_name );
$engine_sources = $engine->get_sources();
if ( empty( $engine_sources ) ) {
return array( 0 );
}
// Get Source post types
$engine_sources = array_map(
function( $source ) {
$source_name = $source->get_name();
$source_name_parts = explode( SEARCHWP_SEPARATOR, $source_name );
return $source_name_parts[1] ?? false;
},
$engine_sources
);
$engine_sources = array_filter(
$engine_sources,
function( $source ) {
return false !== strpos( $source, 'post' . SEARCHWP_SEPARATOR );
},
ARRAY_FILTER_USE_KEY
);
if ( empty( $engine_sources ) ) {
return array( 0 );
}
$searchwp_args = array(
'engine' => $engine_name, // The SearchWP engine to use.
's' => $args['s'], // Pass along the search query.
'fields' => 'ids', // Return only post IDs.
);
if ( ! empty( $args['taxonomy' ] ) ) {
$tax_arg = explode( ':', $args['taxonomy'] );
$searchwp_args['tax_query'] = array(
array(
'taxonomy' => $tax_arg[0],
'field' => 'slug',
'terms' => $tax_arg[1],
),
);
}
if ( ! empty( $args['post_type'] ) ) {
$searchwp_args['post_type'] = array_intersect( $args['post_type'], array_values( $engine_sources ) );
}
// Tell SearchWP to NOT log this search.
add_filter( 'searchwp\statistics\log', '__return_false' );
// Retrieve SearchWP results.
$results = new SWP_Query( $searchwp_args );
// If there are no results, we need to force ACF to reflect that.
if ( empty( $results->posts ) ) {
$results->posts = array( 0 );
}
// We're going to use SearchWP's results to handle the restrictions as outlined.
$args['s'] = '';
$args['order'] = '';
$args['orderby'] = 'post__in';
$args['post__in'] = $results->posts;
return $args;
}
// Tell SearchWP to intercept all ACF Relationship field searches.
add_filter( 'acf/fields/relationship/query', 'my_searchwp_acf_relationship_field_search', 10, 3 );
// Tell SearchWP to intercept a single ACF Relationship field search.
// add_filter( 'acf/fields/relationship/query/name=my_acf_relationship_field_name', 'my_searchwp_acf_relationship_field_search', 10, 3 );

Il y a quelques points à noter avec cet extrait :

Vous pouvez contrôler quel(s) champ(s) de relation utilise SearchWP pour les recherches. La ligne 85 utilise le hook d'ACF pour appliquer les résultats de SearchWP à toutes les recherches de champs de relation.

Si vous souhaitez plutôt choisir les champs de relation avec lesquels vous souhaitez que SearchWP fonctionne, commentez la ligne 85 et décommentez la ligne 88 en veillant à remplacer my_acf_relationship_field_name par le nom de l'un de vos champs de relation. Vous pouvez répéter le hook (en remplaçant le nom du champ de relation) pour chaque champ supplémentaire.

La deuxième chose à noter est que la fonction de rappel my_searchwp_acf_relationship_field_search (qui est ce qui modifie réellement les résultats de recherche ACF pour ce cas d'utilisation) utilise le moteur SearchWP que vous avez défini comme moteur de recherche d'administration dans l'onglet Avancé des paramètres de SearchWP.

Si vous souhaitez remplacer cela, vous pouvez fournir le nom du moteur SearchWP à utiliser à la ligne 13 de l'extrait.

Une fois ce hook en place, SearchWP interceptera les recherches applicables des champs de relation Advanced Custom Fields, en renvoyant les résultats de SearchWP lui-même.

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