web-dev-qa-db-fra.com

Combinaison de plusieurs mots dans une requête de méta-recherche personnalisée

J'essaie de créer une recherche personnalisée pour ma librairie. J'ai deux champs méta personnalisés appelés vbs_author et vbs_publisher qui contiennent le nom de l'auteur et de l'éditeur de ce produit (livre).

Jusqu'à présent, ce que j'ai est:

$s = get_search_query(); 
$args = array(
                'post_type' => 'product',
                'meta_query' => array(
                    'relation' => 'OR',
                        array(
                            'key'     => 'vbs_author',
                            'value'   => $s,
                            'compare' => 'LIKE'
                        ),
                        array(
                            'key'     => 'vbs_publisher',
                            'value'   => $s,
                            'compare' => 'LIKE'
                        )
                )
            );
$the_query = new WP_Query( $args );

Lorsque je recherche un auteur XYZ ou un éditeur ABC individuellement, les résultats sont satisfaisants. Mais lorsque je combine un auteur et un éditeur dans la même recherche, par exemple XYZ ABC, bien qu'il s'agisse de valeurs pour vbs_author et vbs_publisher pour le même produit, la requête renvoie 0 résultat.

J'ai essayé de changer la relation en AND mais cela ne fonctionnait toujours pas ...

1
Nitin Jain

Divisez la requête par un espace et changez 'compare' en 'IN' pour pouvoir utiliser le tableau de méta-valeurs:

<?php

$s = get_search_query();

$s_array = explode( ' ', $s ); // search query array

$args = array(
    'post_type'  = > 'product',
    'meta_query' = > array(
        'relation' => 'OR',
        array(
            'key'     => 'vbs_author',
            'value'   => $s_array, 
            'compare' => 'IN', // note the change
        ),
        array(
            'key'     => 'vbs_publisher',
            'value'   => $s_array,
            'compare' => 'IN', // note the change
        ),
    )
);

Peut-être devrez-vous ensuite supprimer les doublons.

1
Max Yudin