suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wie kann ich in WooCommerce einen Rabatt auf Variablen und einzelne Produkte basierend auf der Warenkorbmenge und den Produktattributen anwenden?

Ich versuche, einen prozentualen Rabatt basierend auf der Anzahl der Produkte im Warenkorb mit einem bestimmten Produktattribut zu gewähren.

Genauer gesagt ist es mein Ziel, beim Kauf von mindestens 6 Produkten mit dem Attribut „flaske“ 15 % Rabatt zu gewähren.

Ich habe dies bei Produkten mit variablen Eigenschaften erfolgreich erreicht, aber bei einem einzelnen/einfachen Produkt gelingt mir das nicht.

Das ist mein bisheriger Code (für Mengen- und Preiskonditionen von WooCommerce ausgeliehen)

// 根据购物车中的产品数量和属性进行折扣。
add_action( 'woocommerce_cart_calculate_fees','wc_cart_item_quantity_discount' );
function wc_cart_item_quantity_discount( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // 初始化变量。
    $min_item_amount = 6; // 最小数量。
    $discount = $items_count = $percent = $items_subtotal = 0;
    $taxonomy   = 'pa_variant'; // 分类
    $term_slugs = array('flaske'); // 术语
    // 遍历购物车中的物品
    foreach( $cart->get_cart() as $cart_item_key => $cart_item ) {
      // 遍历变体
      foreach( $cart_item['variation'] as $attribute => $term_slug ) {
        // 只计算具有属性且数量超过6的物品。
        if( $cart_item['data']->get_price() >= $min_item_amount && $attribute === 'attribute_'.$taxonomy && in_array( $term_slug, $term_slugs ) ) {
            $items_count += $cart_item['quantity'];
            $items_subtotal += $cart_item['line_subtotal'];
        }
      }
    }
    // 条件百分比。
    if ($items_count >= 6 ) {
        $percent = 15;
    }
    // 折扣(应税)。
    if( $items_count > 0 ) {
        // 计算
        $discount -= ($items_subtotal / 100) * $percent;
        $cart->add_fee( __( "Mix & Match rabat - $percent%", "woocommerce" ), $discount, true);
    }
}

Mein aktueller Code funktioniert hervorragend für variable Produkte (Variationen), scheint aber keine Auswirkung auf einzelne Produkte zu haben, selbst wenn ich einzelne Produkte verschenke erhalten dieselben Attribute wie variable Produkte.

Ich vermute, dass das etwas mit der foreach-Schleife zu tun hat, also foreach( $cart_item['variation'] as $attribute => $term_slug ).

Wie kann man es generell so gestalten, dass es auch für ein einzelnes/einfaches Produkt mit dem gleichen Attribut „flaske“ funktioniert?

Vielen Dank für Ihre Hilfe und Anregungen.

P粉592085423P粉592085423491 Tage vor642

Antworte allen(1)Ich werde antworten

  • P粉323374878

    P粉3233748782023-07-24 12:53:06

    根据数量为每个商品提供Woocommerce百分比折扣

    在Woocommerce中排除具有2个特定属性术语的变体,不可使用优惠券

    add_action( 'woocommerce_cart_calculate_fees','wc_cart_item_quantity_discount' );
    function wc_cart_item_quantity_discount( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        // 初始化变量。
        $min_item_amount = 6; // 最小数量
        $discount = $items_count = $percent = $items_subtotal = 0;
        $taxonomy   = 'pa_variant'; // 分类
        $term_slugs = array('flaske'); 
        // 遍历购物车中的物品
        foreach( $cart->get_cart() as $cart_item_key => $cart_item ) {
            $product = $cart_item['data'];
            $price   = $product->get_price();
    
            // 产品变种
            if( $product->is_type('variation') ) {
                // 遍历变种属性
                foreach ($cart_item['variation'] as $attribute => $term_slug) {
                    // 只计算具有属性且数量大于6的物品。
                    if ($price >= $min_item_amount && $attribute === 'attribute_' . $taxonomy && in_array($term_slug, $term_slugs)) {
                        $items_count += $cart_item['quantity'];
                        $items_subtotal += $cart_item['line_subtotal'];
                    }
                }
            } 
            // 简单产品
            elseif ( $product->is_type('simple') ) {
                $attributes = $product->get_attributes();
    
                if( ! empty($attributes) && array_key_exists($taxonomy, $attributes) ) {
                    $terms = (array) $attributes[$taxonomy]->get_terms(); // array of WP_Term objects
                    $slugs = array_map(function($term) { return $term->slug; }, $terms); // Extract only the term slugs
    
                    if ($price >= $min_item_amount && count( array_intersect($slugs, $term_slugs) ) > 0 ) {
                        $items_count += $cart_item['quantity'];
                        $items_subtotal += $cart_item['line_subtotal'];
                    }
                }
            }
        }
        // 条件百分比
        if ($items_count >= 6) {
            $percent = 15;
        }
        // 折扣(应税)。
        if ($items_count > 0) {
            // 计算
            $discount -= ($items_subtotal / 100) * $percent;
            $cart->add_fee(__("Mix & Match rabat - $percent%", "woocommerce"), $discount, true);
        }
    }

    这应该有用

    Antwort
    0
  • StornierenAntwort