web-dev-qa-db-fra.com

Requête messages par Custom Field 'Price'

J'aimerais afficher tous les messages dans une gamme de prix donnée. Par exemple: lorsqu'un utilisateur entre 100 et 1000 (dans deux champs de formulaire distincts), mon site affiche toutes les publications ayant un champ personnalisé appelé price ayant une valeur numérique comprise entre 100 et 1000.

Trouvé ceci dans la documentation de WP Query; Cependant, je ne sais pas comment créer une requête basée sur les entrées d'un formulaire sur mon site WordPress.

$args = array(
'post_type' => 'product',
'meta_query' => array(
    array(
        'key' => 'color',
        'value' => 'blue',
        'compare' => 'NOT LIKE'
    ),
    array(
        'key' => 'price',
        'value' => array( 20, 100 ),
        'type' => 'numeric',
        'compare' => 'BETWEEN'
    )
)
);
$query = new WP_Query( $args );

Merci pour votre temps.

6
Andrew Hendrie

Utilisez l'action pre_get_posts pour détecter certains vars de filtre dans l'URL et filtrer la requête en conséquence.

Par exemple, supposons que votre formulaire définisse price_low et price_high GET vars, de sorte que l'URL se présente comme suit:

domain.com/?price_low=100&price_high=1000

Ensuite, votre fonction de filtrage vérifie la présence de ces vars et crée le meta_query. Cet exemple vérifie s'il s'agit de la requête principale de la page d'accueil, voir la page Balises conditionnelles pour savoir si d'autres types de requêtes sont en cours, comme une catégorie ou une balise, etc.

function wpa_filter_home_query( $query ){
    if( $query->is_home()
    && $query->is_main_query()
    && isset( $_GET['price_low'] )
    && isset( $_GET['price_high'] ) ) {
        $meta_query = array(
            array(
                'key' => 'price',
                'value' => array( $_GET['price_low'], $_GET['price_high'] ),
                'type' => 'numeric',
                'compare' => 'BETWEEN'
            )
        );
        $query->set( 'meta_query', $meta_query );
    }
}
add_action( 'pre_get_posts', 'wpa_filter_home_query' );

EDIT- exemple de formulaire simple pour soumettre des valeurs. Si vous omettez l'attribut action, le formulaire sera envoyé à la page en cours.

<form method="GET">
    <input type="text" name="price_low">
    <input type="text" name="price_high">
    <input type="submit">
</form>
6
Milo

J'ai eu de la chance avec le Custom Query Fields plugin pour ce problème précis avant.

Je ne suis pas sûr à 100% que cela fonctionnera car il n'a pas été mis à jour depuis un an, mais cela peut valoir le coup.

0
annabwashere