Исправлена максимальная скидка по купону На процент Корзины в WooCommerce
У меня есть код купона (XYZ25) в woocommerce, который включает скидку 25%, а максимальная скидка составляет 250 рупий.
Как я могу ограничить пользователей, чтобы они не получали скидку более 250 рупий, если они применяют код купона XYZ25 для скидки 25%.
3 answers
Вы можете установить дополнительный купон
FIX250
код на основе фиксированной скидки на корзину в размере **RS.250
( без налогов) и с Минимальными расходами в(4 x 250) = RS.1000
.Затем с помощью приведенного ниже скрипта, если клиент применит ваш
XYZ25
код купона и если общая сумма корзины составляет до 1000 рупий, он заменитXYZ25
купон поFIX250
отображая в то же время экспликативный обратите внимание...
Вот этот код:
add_action( 'woocommerce_calculate_totals', 'coupon_discount_max_switch', 10, 1);
function coupon_discount_max_switch( $cart_obj ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Set HERE your 2 coupons slugs <=== <=== <=== <=== <=== <=== <=== <=== <===
$coupon_25_percent = 'xyz25';
$coupon_25_fixed = 'fix250';
// Set HERE the limit amount <=== <=== <=== <=== <=== <=== <=== <=== <=== <===
$limit = 250; // Without VAT
$total_discount = $cart_obj->get_cart_discount_total(); // Total cart discount
// When 'xyz25' is set and the total discount is reached
if( $cart_obj->has_discount( $coupon_25_percent ) && $limit_icl_vat <= $total_discount ){
// Remove the 'xyz25' coupon
$cart_obj->remove_coupon( $coupon_25_percent );
// Checking that the fixed dicount is not already set.
if( ! $cart_obj->has_discount( $coupon_25_fixed ) ){
// Add the 'fix250' coupon
$cart_obj->add_discount( $coupon_25_fixed );
// Displaying a custom message
$message = __( "The cart discount limit of Rs.$limit is reached", "woocommerce" );
wc_add_notice( $message, 'notice' );
}
}
}
Код входит в function.php файл вашей активной дочерней темы (или темы) или также в любом файле плагина.
Этот рабочий код протестирован на WooCommerce версий 2.6.x и 3.0+.
Как указал @LoicTheAztec. Это либо фиксированная, либо процентная скидка.
Вот код:
add_filter( 'woocommerce_coupon_get_discount_amount', 'woocommerce_coupon_get_discount_amount', 20, 5 );
function woocommerce_coupon_get_discount_amount( $discount, $discounting_amount, $cart_item, $single, $coupon ) {
$max_discount = 250; // coupon limit
$coupon_code = 'XYZ25'; // coupon to check.
if ( ( $coupon->get_code() == $coupon_code ) && ! is_null( $cart_item ) && WC()->cart->subtotal_ex_tax ) {
$cart_item_qty = is_null( $cart_item ) ? 1 : $cart_item['quantity'];
if ( wc_prices_include_tax() ) {
$discount_percent = ( wc_get_price_including_tax( $cart_item['data'] ) * $cart_item_qty ) / WC()->cart->subtotal;
} else {
$discount_percent = ( wc_get_price_excluding_tax( $cart_item['data'] ) * $cart_item_qty ) / WC()->cart->subtotal_ex_tax;
}
$_discount = ( $max_discount * $discount_percent ) / $cart_item_qty;
$discount = min( $_discount, $discount );
}
return $discount;
}
Что это сделает, так это также вычислит скидку, используя логику "Фиксированной скидки на корзину"; и используя $max_discount
в качестве суммы купона для вычисления. Затем то, что меньше из двух, будет израсходовано.
Проще говоря, давайте возьмем этот пример min( A, B )
. A
- максимальная скидка, а B
- результат расчета процентной скидки.
Мин(250, 100 ) = 100
мин.( 250, 150 ) = 150
мин.( 250, 250 ) = 250
мин.( 250, 300 ) = 250
мин.( 250, 600 ) = 250
Таким образом, в результате всегда получается желаемая максимальная скидка.
Я написал больше кода, относящегося к этому здесь.
ОБНОВЛЕНИЕ другой способ сделать это, но с тем же результатом.
add_filter( 'woocommerce_coupon_get_discount_amount', 'woocommerce_coupon_get_discount_amount', 20, 5 );
function woocommerce_coupon_get_discount_amount( $discount, $discounting_amount, $cart_item, $single, $coupon ) {
$fake_code = 'fake_code_abcdefghigklmnopqrstuvwxyz'; // used to ignore this filter
if ( $coupon->get_code() == $fake_code ) return $discount;
$max_discount = 250; // coupon limit
$coupon_code = 'XYZ25'; // coupon to check.
if ( $coupon->get_code() == $coupon_code ) {
$_coupon = new WC_Coupon( ); // lets create a fake coupon to test our $max_discount.
$_coupon->set_props( array(
'discount_type' => 'fix_cart',
'amount' => $max_discount,
'code' => $fake_code
) );
$_discount = $_coupon->get_discount_amount( $discounting_amount, $cart_item, $single );
$discount = min( $_discount, $discount );
}
return $discount;
}
Вам необходимо добавить этот код в functions.php файл
add_action('woocommerce_coupon_options_usage_limit', 'woocommerce_coupon_options_usage_limit', 10, 2);
function woocommerce_coupon_options_usage_limit($coupon_id, $coupon)
{
echo '<div class="options_group">';
// max discount per coupons
$max_discount = get_post_meta($coupon_id, '_max_discount', true);
woocommerce_wp_text_input(array(
'id' => 'max_discount',
'label' => __('Usage max discount', 'woocommerce'),
'placeholder' => esc_attr__('Unlimited discount', 'woocommerce'),
'description' => __('The maximum discount this coupon can give.', 'woocommerce'),
'type' => 'number',
'desc_tip' => true,
'class' => 'short',
'custom_attributes' => array(
'step' => 1,
'min' => 0,
),
'value' => $max_discount ? $max_discount : '',
));
echo '</div>';
}
add_action('woocommerce_coupon_options_save', 'woocommerce_coupon_options_save', 10, 2);
function woocommerce_coupon_options_save($coupon_id, $coupon)
{
update_post_meta($coupon_id, '_max_discount', wc_format_decimal($_POST['max_discount']));
}
add_filter('woocommerce_coupon_get_discount_amount', 'woocommerce_coupon_get_discount_amount', 20, 5);
function woocommerce_coupon_get_discount_amount($discount, $discounting_amount, $cart_item, $single, $coupon)
{
$max_discount = get_post_meta($coupon->get_id(), '_max_discount', true);
if (isset($max_discount) && is_numeric($max_discount) && ($max_discount > 0) && !is_null($cart_item) && WC()->cart->subtotal_ex_tax)
{
if($discount > $max_discount)
{
$discount = $max_discount;
}
}
return $discount;
}
Этот код добавит опцию в вашу панель администратора в разделе "Купоны ->Ограничение использования". Вы можете установить любую сумму, какую захотите.
Ссылка: http://reigelgallarde.me/programming/woocommerce-set-maximum-coupon-discount/