web-dev-qa-db-fra.com

Recherche avancée par valeurs minimales/maximales

Je construis un formulaire de recherche avancée qui me permet de rechercher selon différents paramètres. Actuellement, la recherche par taxonomies fonctionne bien. Mon problème survient lorsque l'on essaie de fixer un prix minimum. Voici le code dans mon fichier functions.php:

function advanced_search_query($query) {
    if ($query->is_search) {
        $query->set('post_type', array( 'properties' ));

        if (isset($_GET['propertyfor'])) {
            $query->set('taxonomy', 'propertyfor');
            $query->set('terms', $_GET['propertyfor']);
        }

        if (isset($_GET['propertytype'])) {
            $query->set('taxonomy', 'propertytype');
            $query->set('terms', $_GET['propertytype']);
        }

        if (isset($_GET['minPrice'])) {
            $query->set('meta_query', array(
                'key' => 'shru_price',
                'value' => $_GET['minPrice'],
                'compare' => '>=',
                'type' => 'NUMERIC'
            ));
        }
    };
    return $query;
};
add_filter('pre_get_posts', 'advanced_search_query', 1000);

Comme vous pouvez le constater, j'essaie d'utiliser une méta-requête pour la gérer mais rien ne se passe. Le prix minimum est complètement ignoré lors de l'affichage des résultats.

Quelqu'un sait comment réparer?

Edit: Pour votre information, les valeurs numériques sont stockées dans la base de données sans aucun caractère spécial.

UPDATE: Cela fonctionne pour ce qui suit, où je fixe une valeur minimale et maximale et utilise BETWEEN:

    if (isset($_GET['minPrice']) && isset($_GET['maxPrice'])) {
        $query->set('meta_query', array(
            array(
                'key' => 'shru_price',
                'value' => array($_GET['minPrice'], $_GET['maxPrice']),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC'
            )
        ));
    }

mais pas pour ce que j'ai posté à l'origine où un seul est défini et j'utilise >= ou <=. J'ai utilisé des déclarations elseif entre chacune mais aucun résultat n'a été produit.

1
CoreyRS

Un meta_query est un tableau de tableaux . Vous avez seulement un tableau.

    $query->set('meta_query', array(
        'key' => 'shru_price',
        'value' => $_GET['minPrice'],
        'compare' => '>=',
        'type' => 'NUMERIC'
    ));

CA devrait etre:

$query->set(
  'meta_query', 
  array(
    array(
      'key' => 'shru_price',
      'value' => $_GET['minPrice'],
      'compare' => '>=',
      'type' => 'NUMERIC'
    )
  )
);

Et s'il vous plaît valider/désinfecter les données fournies par l'utilisateur avant de les utiliser!

5
s_ha_dum