検索

ホームページ  >  に質問  >  本文

WooCommerce でカートの数量と製品属性に基づいて変数と個々の製品に割引を適用するにはどうすればよいですか?

特定の製品属性を持つカート内の製品の数に基づいてパーセント割引を適用しようとしています。

より正確には、私の目標は、属性「flaske」を持つ製品を少なくとも 6 つ購入する場合に 15% の割引を適用することです。

可変プロパティが設定された製品ではこれを成功させましたが、単一の単純な製品ではそれを行うことができないようです。

これはこれまでの私のコードです (数量と価格条件のために WooCommerce から借用したものです)

// 根据购物车中的产品数量和属性进行折扣。
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);
    }
}

私の現在のコードは可変製品 (バリエーション) ではうまく機能しますが、単一の製品では機能するようですたとえ単一の製品に可変製品と同じ特性を与えたとしても、効果はありません。

これは foreach ループ、つまり foreach( $cart_item['variation'] as $attribute => $term_slug ) と関係があるのではないかと思います。

同じ属性「flaske」を持つ単一/単純な製品でも機能するように、一般的に機能させるにはどうすればよいですか?

ご支援とご提案をいただきまして誠にありがとうございます。

P粉592085423P粉592085423492日前643

全員に返信(1)返信します

  • 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);
        }
    }

    これは機能するはずです

    返事
    0
  • キャンセル返事