wake-up-neo.net

Woocommerce-Abfrage nach Preisspanne und benutzerdefiniertem Metaschlüssel

Ich habe eine Funktion geschrieben, um Produkte nach Preisklassen zu erhalten. Alles funktioniert, aber jetzt muss ich einen zusätzlichen Metaschlüssel hinzufügen, der zwischen 50 und 100 liegt und über Funktionen verfügt, aber der Code gibt keine Produkte zurück. Was ist an diesem Code falsch?

    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

Der Metaschlüssel des vorgestellten Produkts lautet _featured, Sie verwenden jedoch featured in Ihrer Metaabfrage. Dies gibt keine Produkte zurück, da der Schlüssel nicht existiert.

Soweit ich weiß, ist der Wert des Schlüssels yes, daher sollten Ihre Argumente so lauten:

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

Ein weiterer Hinweis ist, den richtigen Weg zu verwenden, um das Attribut des Shortcodes zu erhalten. Sie können dies mit der Funktion shortcode_atts() tun. Hier ist die Syntax für Ihren Fall:

$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']);

Möglicherweise möchten Sie die maximale Anzahl von Beiträgen begrenzen, die ein Benutzer erhalten kann. Dies kann mit der Funktion min() erfolgen:

$limit = min(20, $limit);

Und eine letzte Anmerkung. Wenn Sie WP_Query verwenden, sollten Sie wp_reset_postdata(); anstelle von wp_reset_query(); verwenden, das nach der Verwendung von query_posts(); verwendet wird.

2
Jack Johansson

Seit WC 3.0.0

Sie können wc_get_min_max_price_meta_query() verwenden. Woocommerce erstellt für Sie den Preis min/max meta_query. Dies beinhaltet auch eine Steuerprüfung.

Weitere Infos hier .

Nachfolgend ein Beispiel, das der OP-Frage entspricht:

$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