Đề bài của chúng ta đưa ra là: Có 1 coupon code giảm chiết khấu 10% cho tất cả sản phẩm. Tuy nhiên có một số danh mục sản phẩm khi sử dụng coupon code này khách hàng muốn có mức chiết khấu khác như 20, 30, 40%
Làm thế nào để áp dụng được 2 mức chiết khấu khác nhau chỉ dùng 1 mã coupon? Sau đây là cách giải quyết vấn đề trên (Copy đoạn code vào file function.php trong child theme)
Cách làm này dựa trên việc áp một mức chiết khấu mới = chiết khấu hiện tại * hệ số. Ví dụ muốn danh mục A sale 20% thì sử dụng mức chiết khấu hiện tại nhân với hệ số là 0,02. Như vậy toàn bộ sản phẩm vẫn giữ nguyên chiết khấu 10% nhưng danh mục A sẽ được tính chiết khấu 20%
add_filter( 'woocommerce_coupon_get_discount_amount', 'alter_shop_coupon_data', 20, 5 ); function alter_shop_coupon_data( $round, $discounting_amount, $cart_item, $single, $coupon ){ ## ---- Your settings ---- ## // Related coupons codes to be defined in this array (you can set many) $coupon_codes = array('sale'); // Product categories at 20% (IDs, Slugs or Names) for 20% of discount $product_category20 = array('woman-perfume'); // for 20% discount $second_percentage = 0.02; // 20 % ## ---- The code: Changing the percentage to 20% for specific a product category ---- ## if ( $coupon->is_type('percent') && in_array( $coupon->get_code(), $coupon_codes ) ) { if( has_term( $product_category20, 'product_cat', $cart_item['product_id'] ) ){ $original_coupon_amount = (float) $coupon->get_amount(); $discount = $original_coupon_amount * $second_percentage * $discounting_amount; $round = round( min( $discount, $discounting_amount ), wc_get_rounding_precision() ); } } return $round; }
Khi muốn 1 coupon code áp dụng lên nhiều danh mục với mức chiết khấu khác nhau
add_filter( 'woocommerce_coupon_get_discount_amount', 'alter_shop_coupon_data', 20, 5 ); function alter_shop_coupon_data( $round, $discounting_amount, $cart_item, $single, $coupon ){ ## ---- Your settings ---- ## // Related coupons codes to be defined in this array (you can set many) $coupon_codes = array('carol'); // Product categories at 30% (IDs, Slugs or Names) for 30% of discount $product_category30 = array('brushes', 'hot-kit'); // for 30% discount $second_percentage30 = 0.03; // 30 % ## ---- The code: Changing the percentage to 30% for specific a product category ---- ## if ( $coupon->is_type('percent') && in_array( $coupon->get_code(), $coupon_codes ) ) { if( has_term( $product_category30, 'product_cat', $cart_item['product_id'] ) ){ $original_coupon_amount = (float) $coupon->get_amount(); $discount = $original_coupon_amount * $second_percentage30 * $discounting_amount; $round = round( min( $discount, $discounting_amount ), wc_get_rounding_precision() ); } } $product_category50 = array('gel-top-coats', 'og-collection', 'm-2-in-1-powder', 'chrome-acrylics-5-in-1', 'heavenly-glow'); $second_percentage50 = 0.05; if ( $coupon->is_type('percent') && in_array( $coupon->get_code(), $coupon_codes ) ) { if( has_term( $product_category50, 'product_cat', $cart_item['product_id'] ) ){ $original_coupon_amount = (float) $coupon->get_amount(); $discount = $original_coupon_amount * $second_percentage50 * $discounting_amount; $round = round( min( $discount, $discounting_amount ), wc_get_rounding_precision() ); } } $product_category32 = array('universal-tips'); $second_percentage32 = 0.032; if ( $coupon->is_type('percent') && in_array( $coupon->get_code(), $coupon_codes ) ) { if( has_term( $product_category32, 'product_cat', $cart_item['product_id'] ) ){ $original_coupon_amount = (float) $coupon->get_amount(); $discount = $original_coupon_amount * $second_percentage32 * $discounting_amount; $round = round( min( $discount, $discounting_amount ), wc_get_rounding_precision() ); } } $product_category20 = array('dipping-solutions'); $second_percentage20 = 0.02; if ( $coupon->is_type('percent') && in_array( $coupon->get_code(), $coupon_codes ) ) { if( has_term( $product_category20, 'product_cat', $cart_item['product_id'] ) ){ $original_coupon_amount = (float) $coupon->get_amount(); $discount = $original_coupon_amount * $second_percentage20 * $discounting_amount; $round = round( min( $discount, $discounting_amount ), wc_get_rounding_precision() ); } } $product_category42 = array('duo-gel-polish-set', 'matching-trio'); $second_percentage42 = 0.042; if ( $coupon->is_type('percent') && in_array( $coupon->get_code(), $coupon_codes ) ) { if( has_term( $product_category42, 'product_cat', $cart_item['product_id'] ) ){ $original_coupon_amount = (float) $coupon->get_amount(); $discount = $original_coupon_amount * $second_percentage42 * $discounting_amount; $round = round( min( $discount, $discounting_amount ), wc_get_rounding_precision() ); } } $product_category40 = array('oh-my-glitter', 'monomers'); $second_percentage40 = 0.04; if ( $coupon->is_type('percent') && in_array( $coupon->get_code(), $coupon_codes ) ) { if( has_term( $product_category40, 'product_cat', $cart_item['product_id'] ) ){ $original_coupon_amount = (float) $coupon->get_amount(); $discount = $original_coupon_amount * $second_percentage40 * $discounting_amount; $round = round( min( $discount, $discounting_amount ), wc_get_rounding_precision() ); } } return $round; }