web-dev-qa-db-fra.com

Filtrage de la recherche par champs de relations ACF

J'essaie d'attribuer des publications liées à l'aide du champ de relation ACF. Il a la recherche par tête de recherche pour rechercher par titre de poste.

J'aimerais ajouter la recherche meta_data à la recherche de relations ACF.

enter image description here

Cette question ma requête fonctionne correctement, mais le champ de recherche indique toujours qu'il n'y a aucun résultat.

enter image description here

Je pense que le typeahead supprime les résultats parce que le typeahead correspond uniquement au titre.

Des idées sur la manière de modifier cela pour permettre aux métadonnées de revenir dans les résultats de la recherche?

2
Bryan

Commencez par lire ce message pour comprendre ma réponse Recherche dans un champ personnalisé, le titre du message et le contenu du message

Vous voudrez peut-être utiliser acf/fields/relationship/query/cependant, lors de l'ajout des arguments:

$args['meta_query'] = array(array(
     'key' => 'your_meta',
     'value' => $args['s'],
     'compare' => 'LIKE',
));

vous constaterez qu'en utilisant cette requête, Wordpress recherchera les publications qui contiennent votre chaîne de recherche dans le titre ET dans le champ méta.

Il faut donc ajouter quelques filtres pour que cela fonctionne:

function search_custom_meta_acf_add_join($joins) {
    global $wpdb;
    remove_filter('posts_join','search_custom_meta_acf_add_join');
    return $joins . " INNER JOIN {$wpdb->postmeta} as CMS15 ON ({$wpdb->posts}.ID = CMS15.post_id)";
}

function search_custom_meta_acf_alter_search($search,$qry) {
    global $wpdb;
    remove_filter('posts_search','search_custom_meta_acf_alter_search',1,2);
    $add = $wpdb->prepare("(CMS15.meta_key = 'your_field_name' AND CAST(CMS15.meta_value AS CHAR) LIKE '%%%s%%')",$qry->get('s'));
    $pat = '|\(\((.+)\)\)|';
    $search = preg_replace($pat,'(($1 OR '.$add.'))',$search);
    return $search;
}
function modify_acf_relationship_search_query ($args, $field, $post ) {
    add_filter('posts_join','search_custom_meta_acf_add_join');
    add_filter('posts_search','search_custom_meta_acf_alter_search',1,2);
    return $args;
}
add_filter('acf/fields/relationship/query/name=your_field_name', 'modify_acf_relationship_search_query', 10, 3);

Ce code ne fait que modifier la requête qui recherche dans les publications, car ACF utilise la fonctionnalité de recherche intégrée de wordpress pour effectuer une recherche dans le champ de la relation. Vous n'avez pas à vous soucier des filtres qui modifient la requête de recherche, car ils se suppriment d'eux-mêmes lorsqu'ils sont utilisés.

Selon le réponse que j'ai cité ci-dessus , il n'utilise pas un nom de table personnalisé dans la jointure interne mais je ne l'ai pas fait, cela ne pose aucun problème si vous voulez toujours utiliser le $ args ['meta_query'] paramètre pour un filtrage plus raffiné.

1
javiertoledos