web-dev-qa-db-fra.com

Requête Woocommerce par gamme de prix et clé méta personnalisée

J'ai écrit une fonction pour obtenir les produits par gamme de prix. Tout fonctionne, mais il me faut maintenant ajouter une clé méta supplémentaire, qui ressemblera à 50 - 100 et présentée, mais le code ne renvoie aucun produit. Quel est le problème sur ce code?

    function product_price_filter_box($attr) {
    $limit = intval($attr['limit']);
    $min = intval($attr['min']);
    $max = intval($attr['max']);
    $query = array(
        'post_status' => 'publish',
        'post_type' => 'product',
        'posts_per_page' => $limit,
        'meta_query' => array(
            'relation'      => 'AND',
            array(
                'key' => '_price',
                'value' => array($min, $max),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC'
            ),
            array(
                'key'       => 'featured',
                'value'     => '1',
                'compare'   => '=',
            ),
        )
    );

    $wpquery = new WP_Query($query);
    while ( $wpquery->have_posts() ) : $wpquery->the_post(); global $product;
        wc_get_template_part( 'content', 'product' );
    endwhile;
    wp_reset_query();

}
add_shortcode( 'product_price_filter_box', 'product_price_filter_box' );
1
Foxsk8

La clé méta du produit présenté est _featured, mais vous utilisez featured dans votre méta requête. Cela ne retournera aucun produit, car la clé n'existe pas.

En outre, pour autant que je sache, la valeur de la clé est yes, vos arguments doivent donc être comme suit:

array(
    'key'       => '_featured',
    'value'     => 'yes',
)

Une autre remarque est d'utiliser le bon moyen d'obtenir l'attribut du shortcode. Vous pouvez le faire en utilisant la fonction shortcode_atts(). Voici la syntaxe pour votre cas:

$atts = shortcode_atts(
    array(
        'limit' => '20',
        'min' => '1'
        'max' => '2'
    ), 
    $atts, 
    'product_price_filter_box' 
);

$limit = intval($atts['limit']);
$min = intval($atts['min']);
$max = intval($atts['max']);

Vous voudrez peut-être limiter le nombre maximal de publications qu'un utilisateur peut obtenir. Cela peut être fait en utilisant la fonction min():

$limit = min(20, $limit);

Et une note finale. Si vous utilisez WP_Query, vous devez utiliser wp_reset_postdata(); au lieu de wp_reset_query();, qui est utilisé après avoir utilisé query_posts();.

2
Jack Johansson

Depuis WC 3.0.0

Vous pouvez utiliser wc_get_min_max_price_meta_query(). Woocommerce créera le prix méta_query min/max pour vous. Cela comprend également un contrôle fiscal.

Plus d'infos ici .

Ci-dessous un exemple qui correspond à la question OP:

$meta_query = array(
  'relation'    => 'AND',
  array(
    'key'       => 'your_custom_meta_key',
    'value'     => '1',
    'compare'   => '=',
  ),
);
$meta_query[] = wc_get_min_max_price_meta_query(array(
  'min_price' => 100,
  'max_price' => 200,
));
$query = array(
  'post_status'     => 'publish',
  'post_type'       => 'product',
  'posts_per_page'  => -1,
  'meta_query'      => $meta_query,
);
$wpquery = new WP_Query($query);
0
Bjorn