Быстрый и надёжный хостинг на SSD-дисках от 220 ₽ в месяц   •   Реклама
Артём Мáлков

Скидка в процентах на всю корзину без купона в WooCommerce

23 янв121 комм

WooCommerce – популярное дополнение для WordPress, позволяющее организовать на вашем сайте интернет-магазин. Я работаю с ним очень часто, и чаще всего требуется реализовать какое-нибудь нестандартное решение, которое по умолчанию не предусмотрено системой.

Сегодня я покажу вам шесть вариантов (четыре статических и два динамических) скриптов, с помощью которых можно организовать скидку на вашем сайте без использования купонов.

Фиксированная скидка в процентах на всю корзинку в WooCommerce

Итак, начнем, пожалуй, с самой простой скидки – фиксированной. В ней скидка будет применяться ко всей корзине по итогу, без лишних действий со стороны пользователя.

Скрипт для скидки:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
	
	$cart->add_fee('Фиксированная скидка в 5% ', -$discount);

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Его вы вставляете в низ файла functions.php, который находится в папке вашей темы.

Фиксированная (применяющаяся при наличии в корзине конкретных товаров) скидка в процентах на всю корзинку в WooCommerce

Второй вариант фиксированной скидки – это скидка, которая применяется в зависимости от того, какие товары (или связки товаров) положены в корзину.

Скрипт для применения скидки при наличии конкретного товара в корзине:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	$array_product_id = [];

	foreach($cart->get_cart() as $cart_item) {

		$array_product_id[] = $cart_item['product_id'];
	
	}

	if(in_array(6, $array_product_id)) { // Если в корзине есть товар с ID = 6

		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

		$cart->add_fee('Фиксированная скидка в 5% за выбор акционного товара ', -$discount);

	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Скрипт для применения скидки при наличии одного из товаров в корзине:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	$array_product_id = [];

	foreach($cart->get_cart() as $cart_item) {

		$array_product_id[] = $cart_item['product_id'];
	
	}

	if(in_array(6, $array_product_id) || in_array(7, $array_product_id)) { // Если в корзине есть товар с ID = 6 или ID = 7

		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

		$cart->add_fee('Фиксированная скидка в 5% за выбор акционного товара ', -$discount);

	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Скрипт для применения скидки при наличии конкретных товаров в корзине:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	$array_product_id = [];

	foreach($cart->get_cart() as $cart_item) {

		$array_product_id[] = $cart_item['product_id'];
	
	}

	if(in_array(6, $array_product_id) && in_array(7, $array_product_id)) { // Если в корзине есть товары с ID = 6 и ID = 7

		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

		$cart->add_fee('Фиксированная скидка в 5% за выбор акционных товаров ', -$discount);

	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Нужный из них вы вставляете в низ файла functions.php, который находится в папке вашей темы. Если вы используете вариативные товары, то «product_id» в коде следует заменить на «variation_id».

Фиксированная (применяющаяся при наличии в корзине товаров из конкретных категорий) скидка в процентах на всю корзинку в WooCommerce

Здесь, как вы уже поняли, в отличие от предыдущего варианта для применения скидки проверяется не сам товар, а категория, в которой он находится.

Скрипт для применения скидки при наличии товара в корзине из конкретной категории:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	foreach($cart->get_cart() as $cart_item) {

		if(has_term(16, 'product_cat', $cart_item['product_id'])) { // Если в корзине есть товар из категории с ID = 16

			$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

			$cart->add_fee('Фиксированная скидка в 5% за выбор товара из акционной категории ', -$discount);

			break;

		}
	
	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Скрипт для применения скидки при наличии товара в корзине из одной категории:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	foreach($cart->get_cart() as $cart_item) {

		if(has_term([16, 23], 'product_cat', $cart_item['product_id'])) { // Если в корзине есть товар из категории с ID = 16 или ID = 23

			$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

			$cart->add_fee('Фиксированная скидка в 5% за выбор товара из акционной категории ', -$discount);

			break;

		}
	
	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Скрипт для применения скидки при наличии товара в корзине из конкретных категорий:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	foreach($cart->get_cart() as $cart_item) {

		if(has_term(16, 'product_cat', $cart_item['product_id']) && has_term(23, 'product_cat', $cart_item['product_id'])) { // Если в корзине есть товар из категории с ID = 16 и ID = 23

			$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

			$cart->add_fee('Фиксированная скидка в 5% за выбор товара из акционных категорий ', -$discount);

			break;

		}
	
	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Скрипт для применения скидки при наличии товаров в корзине из конкретных категорий:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	$one_category = false; // Товар из первой категории
	$two_category = false; // Товар из второй категории

	foreach($cart->get_cart() as $cart_item) {

		if(has_term(16, 'product_cat', $cart_item['product_id'])) { // Если в корзине есть товар из категории с ID = 16

			$one_category = true;

		}

		if(has_term(23, 'product_cat', $cart_item['product_id'])) { // Если в корзине есть товар из категории с ID = 23

			$two_category = true;

		}
	
	}

	if($one_category && $two_category) { // Если в корзине есть товары из категорий с ID = 16 и ID = 23

		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

		$cart->add_fee('Фиксированная скидка в 5% за выбор товаров из акционных категорий ', -$discount);

	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Нужный из них вы вставляете все так же в низ файла functions.php, который находится в папке вашей темы.

Фиксированная (применяющаяся в зависимости от выбранного способа доставки) скидка в процентах на всю корзинку в WooCommerce

Помимо того, что скидку мы можем привязать к конкретному товару или, например, его категории, так же легко можно организовать скидку на выбранный способ доставки.

Скрипт для применения скидки при выборе конкретного способа доставки:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	global $woocommerce;

	$delivery_name = '';
	$delivery_selected = [];
	$available_methods = $woocommerce->shipping->get_packages();

	if(isset($woocommerce->session)) {

		$delivery_selected = $woocommerce->session->get('chosen_shipping_methods');

	}

	foreach($available_methods as $method) {
		
		foreach($delivery_selected as $delivery) {
			
			if(isset($method['rates'][$delivery])) {

				$delivery_name = $method['rates'][$delivery]->label;

				break;

			}
		
		}

	}

	if($delivery_name == 'Самовывоз') {

		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

		$cart->add_fee('Фиксированная скидка в 5% за самовывоз ', -$discount);

	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Скрипт для применения скидки при выборе одного из заданных способов доставки:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	global $woocommerce;

	$delivery_name = '';
	$delivery_selected = [];
	$available_methods = $woocommerce->shipping->get_packages();

	if(isset($woocommerce->session)) {

		$delivery_selected = $woocommerce->session->get('chosen_shipping_methods');

	}

	foreach($available_methods as $method) {
		
		foreach($delivery_selected as $delivery) {
			
			if(isset($method['rates'][$delivery])) {

				$delivery_name = $method['rates'][$delivery]->label;

				break;

			}
		
		}

	}

	if($delivery_name == 'Самовывоз' || $delivery_name == 'СДЭК') {

		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%

		$cart->add_fee('Фиксированная скидка в 5% за выбранный способ доставки ', -$discount);

	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Нужный из них вы вставляете в низ файла functions.php, который находится в папке вашей темы.

Динамичная (изменяющаяся в зависимости от итоговой суммы) скидка в процентах на всю корзинку в WooCommerce

В отличие от вышеупомянутых вариантов с фиксированной скидкой, задачка здесь немного сложнее. Нашу скидку мы привяжем к диапазону цен. И, например, когда человек заказал товаров на сумму от 1000 до 10 000 – дадим ему одну скидку, а выше – другую.

Реализация будет выглядеть следующим образом:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	$woo_current_price = $cart->subtotal; // Текущая итоговая сумма
	
	if($woo_current_price >= 1000 && $woo_current_price <= 10000) {
	
		$discount = $cart->subtotal * 0.03; // 0.03 - это 3%
		$cart->add_fee('Скидка в 3% за заказ на сумму от 1 000 до 10 000 рублей ', -$discount);
		
	} elseif($woo_current_price > 10000) {
	
		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
		$cart->add_fee('Скидка в 5% за заказ на сумму более 10 000 рублей ', -$discount);
	
	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Ее вы так же вставляете в самый низ файла functions.php, который находится в папке вашей темы.

Динамичная (изменяющаяся в зависимости от итогового количества товаров) скидка в процентах на всю корзинку в WooCommerce

Здесь, как вы поняли из заголовка, мы будем рассчитывать скидку не от суммы, как мы это делали во втором варианте, а от количества товаров в корзине.

Реализация:

function woo_discount_total(WC_Cart $cart) {

	if(is_admin() && !defined('DOING_AJAX')) {
	
		return;
		
	}

	$woo_count_item = $cart->get_cart_contents_count(); // Количество товаров в корзине
	
	if($woo_count_item >= 10 && $woo_count_item <= 50) {
	
		$discount = $cart->subtotal * 0.03; // 0.03 - это 3%
		$cart->add_fee('Скидка в 3% за заказ включающий в себя от 10 до 50 товаров ', -$discount);
		
	} elseif($woo_count_item > 50) {
	
		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
		$cart->add_fee('Скидка в 5% за заказ включающий в себя более 50 товаров ', -$discount);
	
	}

}

add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');

Предложенный код вы все так же вставляете в низ файла functions.php, который находится в папке вашей темы.

По желанию (в двух последних вариантах) вы можете задать свои диапазоны цен.

121
комментарий
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 0
    1
      •  Пользователь
    19 мар в 17:00

    Артём, добрый день. Подскажите, пожалуйста, как вычесть вес акционного товара из общего веса в корзине (не учитывать его)?

    function woo_discount_total(WC_Cart $cart) {
    
    $woo_count_item = $cart->get_cart_contents_count(); // Количество товаров в корзине
    
    $weight_min = $cart->get_cart_contents_weight(); //  вес товара
    
    $cart_subtotal = $cart->subtotal; // Общая сумма товаров
    
    foreach($cart->get_cart() as $cart_item) {
    
    if($cart_item['data']->get_sale_price() != '') {
    
    // Если у товара есть персональная скидка
    
    $cart_subtotal = $cart_subtotal - $cart_item['data']->get_sale_price() * $cart_item['quantity']; // Вычитаем его акционную стоимость с учётом количества из итоговой цены
    
    } elseif(has_term(168, 'product_cat', $cart_item['product_id'])) {
    
    // Или если товар из категории с ID = 168
    
    $cart_subtotal = $cart_subtotal - $cart_item['data']->get_price() * $cart_item['quantity']; // Вычитаем его стоимость с учётом количества из итоговой цены
    
    }
    
    }
    
    if($weight_min >= 2 && $cart_subtotal > 0) {
    
    $discount = $cart_subtotal * 0.15; // Скидка 15% от оставшейся суммы товаров
    
    $cart->add_fee("Скидка 15%", -$discount);
    
    }
    
    }
    
    add_action('woocommerce_cart_calculate_fees', 'woo_discount_total');

    Благодарю.

    • 0
    2
      •  Пользователь
    25 янв в 03:28

    Извините, а как насчет условия при покупки товара из общей корзины, пример:

    Оптовый клиент покупает товары и условия покупки это: минимальная сумма покупки в размере 20 000 тенге и после этого можно оформить заказ

    • 1
    2
      •  Пользователь
    18 янв в 04:47

    Здравствуйте Артем, помогите пожалуйста, а как прибавить процент, а не убавить? Мне нужно чтобы при выборе метода доставки прибавилась 1% к стоимости товара, я вообще не знаю учусь только можете удалить то что не нужно только прибавить стоимость при определенном доставке 1%

    function woo_discount_total(WC_Cart $cart) {
    
    	if(is_admin() && !defined('DOING_AJAX')) {
    	
    		return;
    		
    	}
    
    	global $woocommerce;
    
    	$delivery_name = '';
    	$delivery_selected = [];
    	$available_methods = $woocommerce->shipping->get_packages();
    
    	if(isset($woocommerce->session)) {
    
    		$delivery_selected = $woocommerce->session->get('chosen_shipping_methods');
    
    	}
    
    	foreach($available_methods as $method) {
    		
    		foreach($delivery_selected as $delivery) {
    			
    			if(isset($method['rates'][$delivery])) {
    
    				$delivery_name = $method['rates'][$delivery]->label;
    
    				break;
    
    			}
    		
    		}
    
    	}
    
    	if($delivery_name == 'Самовывоз') {
    
    		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
    
    		$cart->add_fee('Фиксированная скидка в 5% за самовывоз ', -$discount);
    
    	}
    
    }
    
    add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');
    Скрипт для применения скидки при выборе одного из заданных способов доставки:
    
    function woo_discount_total(WC_Cart $cart) {
    
    	if(is_admin() && !defined('DOING_AJAX')) {
    	
    		return;
    		
    	}
    
    	global $woocommerce;
    
    	$delivery_name = '';
    	$delivery_selected = [];
    	$available_methods = $woocommerce->shipping->get_packages();
    
    	if(isset($woocommerce->session)) {
    
    		$delivery_selected = $woocommerce->session->get('chosen_shipping_methods');
    
    	}
    
    	foreach($available_methods as $method) {
    		
    		foreach($delivery_selected as $delivery) {
    			
    			if(isset($method['rates'][$delivery])) {
    
    				$delivery_name = $method['rates'][$delivery]->label;
    
    				break;
    
    			}
    		
    		}
    
    	}
    
    	if($delivery_name == 'Самовывоз' || $delivery_name == 'СДЭК') {
    
    		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
    
    		$cart->add_fee('Фиксированная скидка в 5% за выбранный способ доставки ', -$discount);
    
    	}
    
    }
    
    add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');
      • 0
      1044
        •  Команда Pandoge
      20 янв в 09:57

      Ержан Садыков, здравствуйте!

      Прибавить нужно к стоимости товара или всё-таки итоговой стоимости всей корзины? Если второе, только просто удалите знак минуса в:

      $cart->add_fee('Фиксированная скидка в 5% за выбранный способ доставки ', -$discount);

      Итоговый вариант надбавки в 5% для способа доставки "Самовывоз" будет таким:

      function woo_discount_total(WC_Cart $cart) {
      
      	if(is_admin() && !defined('DOING_AJAX')) {
      	
      		return;
      		
      	}
      
      	global $woocommerce;
      
      	$delivery_name = '';
      	$delivery_selected = [];
      	$available_methods = $woocommerce->shipping->get_packages();
      
      	if(isset($woocommerce->session)) {
      
      		$delivery_selected = $woocommerce->session->get('chosen_shipping_methods');
      
      	}
      
      	foreach($available_methods as $method) {
      		
      		foreach($delivery_selected as $delivery) {
      			
      			if(isset($method['rates'][$delivery])) {
      
      				$delivery_name = $method['rates'][$delivery]->label;
      
      				break;
      
      			}
      		
      		}
      
      	}
      
      	if($delivery_name == 'Самовывоз') {
      
      		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
      
      		$cart->add_fee('Надбавка в 5% за самовывоз ', $discount);
      
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');
    • 0
    1
      •  Пользователь
    28 дек в 07:01

    Здарвствуйте Артём.

    Огромное спасибо за код для Woocommerce.

    Подскажите, пожалуйста, как сделать скидку цены без налогов, чтобы потом налоги считались на ту сумму, которая со скидкой?

    $cart->subtotal - показывают сумму с налогами

    • 1
    9
      •  Пользователь
    1 сен в 10:36

    Добрый день.

    Спасибо Вам за скрипты. Очень помогли.

    Подскажите, я использовала скрипт, чтобы скидка применялась в зависимости от доставки. Как убрать эту скидку только для определенной категории товаров или можно по ID товаров, при этом, чтобы товары по sale не затрагивал.

    Я находила код на просторах интернета, но скидка применяется еще и на товары которые по скидке.

    Буду Вам благодарна за помощь.

      • 1
      9
        •  Пользователь
      5 сен в 16:12

      Очень нужна помощь, пожалуйста.

      В дополнении: изначально нужно было применить скидку на всю корзину при доставке "Самовывоз", но теперь нужно исключить 2 товара по этой скидке.

      • 1
      1044
        •  Команда Pandoge
      8 сен в 01:26

      светлана, здравствуйте!

      Правильно ли я понял, что вам нужно применить скидку, в зависимости от доставки (в вашем случае - Самовывоз), но чтобы она не распространялась на определённые товары?

      • 1
      9
        •  Пользователь
      8 сен в 12:21

      Артём Мáлков, добрый день!

      Да, верно.

      Также, чтобы не затрагивались акционные товары.

      • 1
      9
        •  Пользователь
      14 сен в 10:46

      Артём Мáлков, очень прошу вашей помощи, не могу нигде найти ответа на мой вопрос.

      • 1
      1044
        •  Команда Pandoge
      18 сен в 00:11

      светлана, сегодня постараюсь посмотреть.

      • 1
      1044
        •  Команда Pandoge
      изменено 20 сен в 01:54

      светлана, здравствуйте!

      Давайте попробуем так:

      function woo_discount_total(WC_Cart $cart) {
      
      	if(is_admin() && !defined('DOING_AJAX')) {
      	
      		return;
      		
      	}
      
      	global $woocommerce;
      
      	$delivery_name = '';
      	$delivery_selected = [];
      	$available_methods = $woocommerce->shipping->get_packages();
      
      	if(isset($woocommerce->session)) {
      
      		$delivery_selected = $woocommerce->session->get('chosen_shipping_methods');
      
      	}
      
      	foreach($available_methods as $method) {
      		
      		foreach($delivery_selected as $delivery) {
      			
      			if(isset($method['rates'][$delivery])) {
      
      				$delivery_name = $method['rates'][$delivery]->label;
      
      				break;
      
      			}
      		
      		}
      
      	}
      
      	$cart_subtotal = $cart->subtotal; // Общая сумма товаров
      
      	$excluded_items = [10, 14]; // ID исключённых товаров
      
      	foreach($cart->get_cart() as $cart_item) {
      				
      		if($cart_item['data']->get_sale_price() != '') {
      
      			// Если у товара есть персональная скидка
      
      			$cart_subtotal = $cart_subtotal - $cart_item['data']->get_sale_price() * $cart_item['quantity']; // Вычитаем его акционную стоимость с учётом количества из итоговой цены
      
      		} elseif(in_array($cart_item['product_id'], $excluded_items)) {
      
      			// Или если товар из исключённого списка
      					
      			$cart_subtotal = $cart_subtotal - $cart_item['data']->get_price() * $cart_item['quantity']; // Вычитаем его стоимость с учётом количества из итоговой цены
      
      		}
      
      	}
      
      	if($delivery_name == 'Самовывоз' && $cart_subtotal > 0) {
      
      		// Если способ доставки Самовывоз и оставшаяся итогая сумма товаров с учётом исключений больше 0
      
      		$discount = $cart_subtotal * 0.05; // Скидка 5% от оставшейся суммы товаров
      
      		$cart->add_fee('Фиксированная скидка в 5% за самовывоз ', -$discount);
      
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');
      • 1
      9
        •  Пользователь
      20 сен в 16:19

      Артём Мáлков, скидка почему-то распространяется на все акционные товары((.

      ID товаров я меняла на свои, которые должны были быть исключены.

      • 1
      1044
        •  Команда Pandoge
      20 сен в 18:33

      светлана, какой товар у вас считается акционным?

      • 1
      9
        •  Пользователь
      22 сен в 03:45

      Артём Мáлков, тот, который перечеркнут. То есть есть старая цена, она зачеркнута и вместо него есть новая.

      Такое ощущение, что ID товаров, которое я прописываю не влияет, то есть просто все товары, по которым есть скидки входят в категорию, где не распространяется скидка((

      • 2
      9
        •  Пользователь
      22 сен в 03:47

      Артём Мáлков, да и хочу Вас поблагодарить, что помогаете разобраться в этой ситуации. И спасибо огромное, что уделяете этому свое время!

      • 1
      1044
        •  Команда Pandoge
      изменено 22 сен в 13:37

      светлана, предложенный скрипт работает по такой схеме:

      1. Сначала проверяется каждый товар и если у него есть персональная скидка, его стоимость с учётом количества вычитается из общей суммы.

      2. Если у товара нет персональной скидки, проверяется, указан ли он в списке исключенных. Если да то делается тоже самое, что в пункте 1.

      3. Далее проверяется оставшаяся сумма, если она больше нуля + Самовызов, то из этого значения рассчитываем скидку.

      То есть скидка здесь распространяется не на товары, на их остаточную общую сумму.

      У вас это работает некорректно?

      • 2
      9
        •  Пользователь
      23 сен в 04:26

      Артём Мáлков,. Я внесла ID товаров в Ваш код, на которые не распространяется акция (то есть у них стоит одна цена) и скидка при выборе Самовывоз исключилась (то есть она не действует), но в это же время эта скидка не действует и на все акционные товары (у которых есть старая цена и новая).

      Исходя из этого, данный скрипт работает корректно.

      Но мне нужно, чтобы акционные товары не затрагивались. Исключались только те 2 товара, которые мне нужно исключить, не зависимо от того со скидкой они или нет.

      • 1
      1044
        •  Команда Pandoge
      изменено 23 сен в 10:47

      светлана, тогда, если я правильно понял, так:

      function woo_discount_total(WC_Cart $cart) {
      
      	if(is_admin() && !defined('DOING_AJAX')) {
      	
      		return;
      		
      	}
      
      	global $woocommerce;
      
      	$delivery_name = '';
      	$delivery_selected = [];
      	$available_methods = $woocommerce->shipping->get_packages();
      
      	if(isset($woocommerce->session)) {
      
      		$delivery_selected = $woocommerce->session->get('chosen_shipping_methods');
      
      	}
      
      	foreach($available_methods as $method) {
      		
      		foreach($delivery_selected as $delivery) {
      			
      			if(isset($method['rates'][$delivery])) {
      
      				$delivery_name = $method['rates'][$delivery]->label;
      
      				break;
      
      			}
      		
      		}
      
      	}
      
      	$cart_subtotal = $cart->subtotal; // Общая сумма товаров
      
      	$excluded_items = [10, 14]; // ID исключённых товаров
      
      	foreach($cart->get_cart() as $cart_item) {
      				
      		if(in_array($cart_item['product_id'], $excluded_items)) {
      
      			// Если товар из исключённого списка
      
      			if($cart_item['data']->get_sale_price() != '') {
      
      				// Если у товара акционная цена
      
      				$cart_item_price = $cart_item['data']->get_sale_price();
      
      			} else {
      
      				$cart_item_price = $cart_item['data']->get_price();
      
      			}
      
      			$cart_subtotal = $cart_subtotal - $cart_item_price * $cart_item['quantity']; // Вычитаем его стоимость с учётом количества из итоговой суммы
      
      		}
      
      	}
      
      	if($delivery_name == 'Самовывоз' && $cart_subtotal > 0) {
      
      		// Если способ доставки Самовывоз и оставшаяся итоговая сумма товаров с учётом исключений больше 0
      
      		$discount = $cart_subtotal * 0.05; // Скидка 5% от оставшейся суммы товаров
      
      		$cart->add_fee('Фиксированная скидка в 5% за самовывоз ', -$discount);
      
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees' , 'woo_discount_total');
      • 2
      9
        •  Пользователь
      24 сен в 00:11

      Артём Мáлков, Вы чудо!

      Вы правильно поняли меня.

      Я Вам премного благодарна за Вашу помощь. Скрипт работает именно так, как нужно!

      Вы невероятный. Я долго искала и не могла найти то, что нужно.

      Желаю Вам процветания и добра!

      • 1
      1044
        •  Команда Pandoge
      24 сен в 01:02

      светлана, не забывайте про нас smiley

    • 2
    1
      •  Пользователь
    7 июл в 16:58

    Здравствуйте, сделал такое условие, как сделать чтобы в корзине тоже показывался итог и надпись скидки? Сейчас только по переходу на оформление заказа (т.е. после корзины)

    function add_discount(WC_Cart $cart) {
    
    	if(is_admin() && !defined('DOING_AJAX') || is_cart()) {
    
    		return;
    	
    	}
    	$woo_current_price = $cart->subtotal;	
    	$category_arr = [482]; // Массив категорий попадающих под скидку
    	$total_price_category = 0; // Итоговая сумма акционных категорий
    		
    	foreach($cart->get_cart() as $cart_item) {
    	
    		foreach($category_arr as $category_value) {
    			
    			if(has_term($category_value, 'product_cat', $cart_item['product_id'])  && ($woo_current_price > 10000)) { // Если в корзине есть товар из акционной категории
    				
    				$total_price_category += $cart_item['data']->get_price() * $cart_item['quantity'];
    		
    				break;
    					
    			}
    			
    		}
    		
    	}
    
    		
    		$cart->add_fee('Скидка за наличие товара из категории НАШЕ ', -$total_price_category * 0.1); // Скидка в 10% от суммы акционных категорий
    		
    	
    
    }
    
    add_action('woocommerce_cart_calculate_fees', 'add_discount');
      • 2
      1044
        •  Команда Pandoge
      9 июл в 00:58

      Афанасий Павлов, здравствуйте!

      В функции удалите часть:

       || is_cart()

      И на сколько я вижу, сообщение о скидке будет показываться даже если в корзине нет акционного товара.

    • 1
    4
      •  Пользователь
    2 фев в 14:44

    Скрипты бомба! Выручили. А как сделать такое: акция по определенным категориям 1+1=3 (наименьшая цена товара убирается из расчета)

      • 1
      1044
        •  Команда Pandoge
      3 фев в 12:07

      Александр Бильский, думаю, что смогу такое сделать, но, что будет, если мы добавили 4 разных товара из акционной категории или 2 товара по 2 штуки каждого (то есть 4 в сумме)?

      • 1
      4
        •  Пользователь
      3 фев в 19:59

      Артём Мáлков, Вариант. Так напрягся в решении, что совсем не подумал про такое. Спасибо! Получается нужно дополнительно проверять кол-во товара и если не =3, писать что так незя :-). Все стало ещё хуже - "конструкция" усложнилась

      • 1
      1044
        •  Команда Pandoge
      5 фев в 23:21

      Александр Бильский, я посмотрел как данную акцию проводят другие, варианты есть следующие:

      1. Если есть 3 или больше акционных товаров - один (с наименьшей стоимостью) делают бесплатным.

      2. Как только набирается группа из трех товаров - один (с наименьшей стоимостью) делают бесплатным. Если товаров акционных 6 - два (с наименьшей стоимостью) делают бесплатными и так далее с шагом 3. Если товаров 5, то, по логике, только 1 товар становиться бесплатным.

      Может по какому-то из этих вариантов сделать?

      • 1
      4
        •  Пользователь
      8 фев в 01:05

      Артём Мáлков, Добрый день (вечер) :-). Вариант 1 кажется простым и понятным (Жаль не могу сказать того же по программированию). Как реализовать такое? Спасибо!

      • 1
      1044
        •  Команда Pandoge
      изменено 11 фев в 22:49

      Александр Бильский, здравствуйте!

      Скоро займусь вашим вопросом.

      • 2
      4
        •  Пользователь
      15 фев в 11:03

      Артём Мáлков, Спасибо! smiley

    • 1
    1
      •  Пользователь
    26 янв в 18:50

    Артём Мáлков, здравствуйте!

    Очень классные скрипты, спасибо вам огромное!

    Не смог найти похожего из разобранных случаев, не в статье, не в комментариях.

    Нужно сделать скидку от суммы заказа 5000 руб. - 5%, но только не на товары, на которые действует "стоп цена".

    Помогите пожалуйста

      • 1
      1044
        •  Команда Pandoge
      29 янв в 20:47

      Максим, здравствуйте!

      Подскажите, что такое "стоп цена"?

    • 1
    1
      •  Пользователь
    20 дек в 19:34

    Артем, спасибо! Отлично помогли с категориями.

    Подскажите, данную функцию можно применить по атрибутам...

    Например, у меня в магазине есть бренды, на которые я хочу сделать постоянную скидку в корзине, есть ли возможность подвязать к атрибутам.

    Имя атрибута: brand, Значение атрибута: adidas.

    Заранее спасибо!

      • 2
      1044
        •  Команда Pandoge
      21 дек в 13:00

      Николай, здравствуйте!

      Посмотрю сегодня - завтра.

      • 3
      1044
        •  Команда Pandoge
      27 дек в 01:18

      Николай, здравствуйте!

      Правильно ли я понял, вы хотите сделать скидку на конкретные товары по атрибуту?

    • 2
    1
      •  Пользователь
    19 июл в 12:04

    Здравствуйте, Артём,

    собрал код на основе статьи, но не могу понять, как исключить одну категорию, пробовал вставить условие по примерам ответов ниже, но что-то не выходит, видимо что-то упустил. Подскажите, пжлст, как в этом коде кроме товаров с sale_price исключить и определённую категорию

    function woo_discount_total(WC_Cart $cart) {
    
    	$woo_count_item = $cart->get_cart_contents_count(); // Количество товаров в корзине
    
    	$cart_subtotal = $cart->subtotal;
    
    	foreach($cart->get_cart() as $hash => $value) {
    
    		if($value['data']->get_sale_price() != '') {
    
    			$cart_subtotal = $cart_subtotal - $value['data']->get_sale_price() * $value['quantity'];
    
    		}
    
    	}
    	
    	foreach ($cart->get_cart() as $cart_item)  {
    
            if ($woo_count_item >= 3) {
    
                $discount = $cart_subtotal * 0.1; // 0.1 - это 10%
    
                if ($discount > 0) {
                	$cart->add_fee("-10%", -$discount);
                }
    
            }
    
        }
    	
    }
    
    add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");

    Спасибо

      • 1
      1044
        •  Команда Pandoge
      31 июл в 12:17

      Soroka95, здравствуйте!

      Я вижу это так:

      function woo_discount_total(WC_Cart $cart) {
      
      	$woo_count_item = $cart->get_cart_contents_count(); // Количество товаров в корзине
      	$cart_subtotal = $cart->subtotal; // Общая сумма товаров
      
      	foreach($cart->get_cart() as $cart_item) {
      				
      		if($cart_item['data']->get_sale_price() != '') {
      
      			// Если у товара есть персональная скидка
      
      			$cart_subtotal = $cart_subtotal - $cart_item['data']->get_sale_price() * $cart_item['quantity']; // Вычитаем его акционную стоимость с учётом количества из итоговой цены
      
      		} elseif(has_term(20, 'product_cat', $cart_item['product_id'])) {
      
      			// Или если товар из категории с ID = 20
      					
      			$cart_subtotal = $cart_subtotal - $cart_item['data']->get_price() * $cart_item['quantity']; // Вычитаем его стоимость с учётом количества из итоговой цены
      						
      		}
      
      	}
      
      	if($woo_count_item >= 3 && $cart_subtotal > 0) {
      
      		// Если товаров в корзине больше или равно 3 и оставшаяся итогая сумма товаров с учётом исключений больше 0
      
      		$discount = $cart_subtotal * 0.1; // Скидка 10% от оставшейся суммы товаров
      
      		$cart->add_fee("Скидка 10%", -$discount);
      	
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees', 'woo_discount_total');
    • 3
    3
      •  Пользователь
    30 апр в 15:02

    Здравствуйте Артём. очень интересный вариант скидок.

    Не могли бы мне помочь? мне нужно сделать скидку от суммы товаров

    от 500 минус 10%

    от 2000 минус 20%

    от 10000 минус 30%

    На все все товары кроме одной категории (брак)

      • 1
      1044
        •  Команда Pandoge
      8 мая в 02:29

      rlbeor, здравствуйте!

      Попробуйте так:

      function add_discount(WC_Cart $cart) {
      
      	if(is_admin() && !defined('DOING_AJAX')) {
      
      		return;
      	
      	}
      		
      	$total_price_category = 0;
      		
      	foreach($cart->get_cart() as $cart_item) {
      	
      		if(!has_term(20, 'product_cat', $cart_item['product_id'])) { // 20 - ID категории, которую исключаем
      				
      			$total_price_category += $cart_item['data']->get_price() * $cart_item['quantity'];
      		
      					
      		}
      		
      	}
      
      	if($total_price_category >= 500) {
      	
      		if($total_price_category >= 10000) {
      	
      			$discount = 0.3;
      			
      			$discount_text = '30% за заказ от 10 000 рублей';
      			
      		} elseif($total_price_category >= 2000) {
      			
      			$discount = 0.2;
      			
      			$discount_text = '20% за заказ от 2 000 рублей';
      			
      		} elseif($total_price_category >= 500) {
      			
      			$discount = 0.1;
      			
      			$discount_text = '10% за заказ от 500 рублей';
      			
      		}
      		
      		$cart->add_fee('Скидка '.$discount_text, -$total_price_category * $discount);
      		
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees', 'add_discount');
      • 1
      1
        •  Пользователь
      31 мая в 12:08

      Артём Мáлков, Добрый день, подскажите а можно указать несколько категорий в исключение? через запятую?

      • 1
      3
        •  Пользователь
      31 мая в 12:44

      Артём Мáлков, здравствуйте, спасибо за ответ всё работает. В исключение можно добавить несколько категорий?

      • 3
      3
        •  Пользователь
      1 июн в 14:21

      Артём Мáлков, Всё, разобрался сам)

      if(!has_term([52, 56, 57], 'product_cat', $cart_item['product_id'])) {

      оказалось всё проще чем я думал. Но всё равно спасибо Вам огромное за скрипт)

    • 2
    2
      •  Пользователь
    20 апр в 21:37

    Артем, здравствуйте, благодарю вас за столько простые решения, пол интеренета перелопатил, пока вас нашел. Очень полезный контент.

    Подскажите пожалуйста, как можно сделать выбор по категориям, а скидку от количества товаров из этих категории?

    Пример:

    Если есть товар из категории 1 больше 15 штук, то скидка 5%

    Если есть товар из категории 2 больше 15 штук, то скидка 5%

    Если есть товар из категории 1 и категории 2 суммарно больше 15 штук, то скидка 5%

      • 2
      2
        •  Пользователь
      21 апр в 17:21

      Ирик Габдулхаков, собрал вот такое решение, с помощью твоих решении буду тестить. Благодарю

      // Скидка по количеству товаров в корзине из определенных категории
      function woo_discount_total(WC_Cart $cart) {
      	$woo_count_item = $cart->get_cart_contents_count(); // Количество товаров в корзине
      	foreach($cart->get_cart() as $cart_item) {
      
      if(has_term("39", "product_cat", $cart_item["product_id"]) || has_term("45", "product_cat", $cart_item["product_id"])) { // Если в корзине есть товар из категории с ID = 39 или ID = 45
      if($woo_count_item >= 10 && $woo_count_item <= 15) {
      
      $discount = $cart->subtotal * 0.03; // 0.03 - это 3%
      
      $cart->add_fee("Скидка в 3% за заказ включающий в себя от 10 до 15 товаров ", -$discount);
      
      } elseif($woo_count_item > 15) {
      
      $discount = $cart->subtotal * 0.05; // 0.05 - это 5%
      
      $cart->add_fee("Скидка в 5% за заказ включающий в себя более 15 товаров ", -$discount);
      
      }
      
      }
      
      }
      
      }
      
      add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");
    • 2
    4
      •  Пользователь
    9 апр в 18:11

    Артем, снова огромное спасибо!

    Прямо лучшие статьи, которые на самом деле помогают.

    Можете подсказать по подобному вопросу. Нужно заменить цену на товар в корзине на другую (есть дополнительное поле при вводе товара)

    //Добавление Поля с оптовой ценой

    function custom_woocommerce_product_options_pricing() {

    $price_index = '_custom_price';

    woocommerce_wp_text_input(

    array(

    'id' => $price_index,

    'value' => get_post_meta( get_the_ID(), $price_index, true ),

    'data_type' => 'price',

    'type'

    => 'number',

    'label' => __( 'Custom price', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')'

    )

    );

    }

    add_action( 'woocommerce_admin_process_product_object', 'custom_woocommerce_admin_process_product_object', 10, 1 );

    function custom_woocommerce_admin_process_product_object( $product ) {

    $price_index = '_custom_price';

    $price = wc_clean( wp_unslash( $_POST[ $price_index ] ) );

    update_post_meta( $product->get_id(), $price_index, $price );

    }

    Если я напишу echo get_post_meta( get_the_ID(), $price_index, true) то на странице товара выводится введенное числовое значение(например 400)

    Но вывести это значение в корзине не получается

    пробовал так $cart_item['data']->set_price( get_post_meta( get_the_ID(), $price_index, true) ); - получается ошибка

    $cart_item['data']->set_price(intval(get_post_meta( get_the_ID(), $price_index, true )) - так выводит "0"

    Прошу прощения если ОФФтоп

      • 1
      4
        •  Пользователь
      14 апр в 06:08

      Еще раз извиняюсь за сумбур, ковырял все выходные cry . Суть в том, что если я хочу получить значение дополнительного поля (число вводится в админке при заведении товара) на странице товара - пишу echo get_post_meta( get_the_ID(), $price_index, true ) - всё работает, выводит нужное значение.

      а в корзине эта же функция возвращает значение "array" . Пробовал вместо id ставить просто число. Да что не так то.

      function truemisha_quantity_based_price( $cart_object ) {
       
       	// вообще всегда можно сделать print_r( $cart_object ); exit; если что-то не ясно
       
      	$product_id = 93; // целевой ID товара с динамической ценой
      	$value_opt = get_post_meta( 93, $price_index, true  );
      	echo $value_opt;
    • 2
    1
      •  Пользователь
    4 апр в 19:10

    Артем, спасибо за отличное решение задачи. Вы помогли многим люядм)

    Было бы еще круто если бы написали к скрипты для скилок 1+1=3 и скидка на второй товар 50%

    • 1
    1
      •  Проверенный
    21 мар в 09:09

    Доброе утро! Благодарю за такое простое и быстрое решение, без плагинов. Подскажите как сделать так, чтобы Динамичная (изменяющаяся в зависимости от итоговой суммы) скидка в процентах на всю корзинку в WooCommerce, не действовала на акционные товары. То есть на те товары, по которым уже есть дисконт прописанный в плагине WooCommerce? Буду очень признательна за ответ.

    • 2
    5
      •  Проверенный
    9 мар в 03:42

    Здравствуйте

    Опять вопросы со скидками

    сделала скидку 80% от общей сумы

    но мне нужно сделать что бы при клике на чек бокс этак скидка появлялась и когда чекбокс не активен - отключалась, проблема только в том , что ajax не обновляется страница оформление закза

    можете подсказать как сделать что бы страница и цена обновлялась при отметки или снятие отметки на чекбоксе

     function woo_discount_total(WC_Cart $cart) {
     	
    	if(is_admin() && !defined("DOING_AJAX") || is_cart()) {
    	
    		return;
    		
    	}
    
    	if ( $_POST['prepayment'] == '')
    	{
    	
    	
    	}
    	  else {
    		$discount = $cart->subtotal * 0.80; // 0.05 - это 5%
    		
    		$cart->add_fee("", -$discount);
    	}
    
    }
    
    add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");
      • 1
      1044
        •  Команда Pandoge
      5 апр в 23:43

      Ксения Сова, здравствуйте!

      Прошу прощения за поздний ответ. Какую роль выполняет чекбокс?

      • 1
      5
        •  Проверенный
      17 мая в 17:38

      Артём Мáлков, Здравстуйте

      есть товар и у него цена допустим 20 000

      оплата происходит через приложение сбербанк

      я кое как смогла поставить чек бокс в оформление заказа

      при отметке его, дается скидка 80% типа как предоплата

      когда убираеш отметку цена опять полностью возвращается, но сбербанк плагин отказывается проводить оплату со скидкой потому что как я поняла в корзине цена одна, а в оформление другая, теперь я этот чекбокс хочу перенести в корзину, но там уже нигде ничего не работает, можете подсказать как в корзине сделать чекбокс при клике на который дается скидка 80%?

    • 1
    7
      •  Пользователь
    20 фев в 13:27

    Здравствуйте, подскажите как поступить, если нужна скидка 5% при оплате онлайн и на конкретные несколько категорий?

    function add_discount(WC_Cart $cart) {

    if(is_admin() && !defined("DOING_AJAX") || is_cart()) {

    return;

    }

    if(WC()->session->get("chosen_payment_method") == "bacs") {

    $cart->add_fee("Скидка за метод", -$cart->cart_contents_total * 0.1);

    }

    }

    add_action("woocommerce_cart_calculate_fees", "add_discount");

      • 1
      7
        •  Пользователь
      21 фев в 11:52

      Пожалуйста, спасите меня умные люди, нужно совместить 2 скрипта. Скидка 5%, например, на 7 категорий из 10 при условии оплаты картой! пожалуйста!!!

      • 1
      1044
        •  Команда Pandoge
      изменено 22 фев в 01:16

      Марина, здравствуйте!

      В статье нет инструкции по скидке за выбранный способ оплаты, поэтому не могу ручаться за корректность кода:

      function add_discount(WC_Cart $cart) {
      
      	if(is_admin() && !defined('DOING_AJAX') || is_cart()) {
      
      		return;
      	
      	}
      		
      	$category_arr = [16, 23]; // Массив категорий попадающих под скидку
      	$total_price_category = 0; // Итоговая сумма акционных категорий
      		
      	foreach($cart->get_cart() as $cart_item) {
      	
      		foreach($category_arr as $category_value) {
      			
      			if(has_term($category_value, 'product_cat', $cart_item['product_id'])) { // Если в корзине есть товар из акционной категории
      				
      				$total_price_category += $cart_item['data']->get_price() * $cart_item['quantity'];
      		
      				break;
      					
      			}
      			
      		}
      		
      	}
      
      	if(WC()->session->get('chosen_payment_method') == 'bacs' && $total_price_category > 0) { // Если выбран определенный способ оплаты и итоговая сумма товаров из акционных категорий больше 0
      		
      		$cart->add_fee('Скидка за метод оплаты и наличие товара из акционной категории', -$total_price_category * 0.1); // Скидка в 10% от суммы акционных категорий
      		
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees', 'add_discount');

      Проверьте, чтобы bacs отвечал за онлайн оплату + не забудьте указать необходимый вам перечень категорий.

      • 2
      7
        •  Пользователь
      24 фев в 14:35

      Артём Мáлков, Вот это Да! Огромное спасибо, попробую отпишусь! Подскажите, а здесь не совсем поняла что указывать?

      $total_price_category = 0; // Итоговая сумма акционных категорий

      • 1
      1044
        •  Команда Pandoge
      24 фев в 22:32

      Марина, ничего, оставляете без изменений.

      • 1
      7
        •  Пользователь
      25 фев в 10:49

      Артём Мáлков, подскажите как это сделать? пока не получается со скидкой(

      • 1
      7
        •  Пользователь
      25 фев в 10:50

      Артём Мáлков, Как проверить Что bacs отвечает за оплату на сайте? и если он все такине отвечает

      • 1
      7
        •  Пользователь
      25 фев в 11:31

      Артём Мáлков, Здравствуйте получилось!!!! Ура спасибо, но смотрите, что мне пришлось подгадывать там где процент скидки. Как то можно этого избежать? У нас с НДС цены, а когда пишешь 0,05 выдает скидку 6%

      function add_discount(WC_Cart $cart) {
      
      	if(is_admin() && !defined('DOING_AJAX') || is_cart()) {
      
      		return;
      	
      	}
      		
      	$category_arr = [20, 22, 59, 60, 61, 62, 65, 66, 68, 70, 71, 72, 73, 75, 76, 77, 78, 79, 99, 100, 122, 123, 124];
      	$total_price_category = 0;
      		
      	foreach($cart->get_cart() as $cart_item) {
      	
      		foreach($category_arr as $category_value) {
      			
      			if(has_term($category_value, 'product_cat', $cart_item['product_id'])) {
      				
      				$total_price_category += $cart_item['data']->get_price() * $cart_item['quantity'];
      		
      				break;
      					
      			}
      			
      		}
      		
      	}
      
      	if(WC()->session->get('chosen_payment_method') == 'yookassa_widget' && $total_price_category > 0) {
      		
      		$cart->add_fee('Скидка 5% за оплату картой на сайте и наличие товара из акционной категории', -$total_price_category * 0.0416666);		
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees', 'add_discount');
      • 2
      7
        •  Пользователь
      25 фев в 13:19

      Артём Мáлков, В чеке скидка размазывается чежду товаром из скидочной категории и товаром не из скидочной категории. Кто как решил эту проблему? Или все без привязанной кассы работают?

      • 1
      1044
        •  Команда Pandoge
      28 фев в 23:43

      Марина, скидка идет не на товары, а на всю корзину (итоговую цену). Чтобы делать скидку на конкретный товар, нужно переопределять его цену. У нас пока нет статьи по этому поводу, но она в планах.

    • 2
    2
      •  Пользователь
    14 фев в 19:57

    Артём Мáлков, приветствуем!

    Очень классные скрипты, просто золото! Спасибо вам огромное)

    Очень хотелось бы увидеть готовый скрипт на скидку в % от и до определенной суммы на всю корзинку, но только при определенных категориях. У вас это 2 отдельных скрипта.

    То есть скидка на определенные категории:

     
    function woo_discount_total(WC_Cart $cart) {
    
    	$one_category = false; // Товар из первой категории
    	$two_category = false; // Товар из второй категории
    
    	foreach($cart->get_cart() as $cart_item) {
    
    		if(has_term("16", "product_cat", $cart_item["product_id"])) { // Если в корзине есть товар из категории с ID = 16
    
    			$one_category = true;
    
    		}
    
    		if(has_term("23", "product_cat", $cart_item["product_id"])) { // Если в корзине есть товар из категории с ID = 23
    
    			$two_category = true;
    
    		}
    	
    	}
    
    	if($one_category && $two_category) { // Если в корзине есть товары из категорий с ID = 16 и ID = 23
    
    		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
    
    		$cart->add_fee("Фиксированная скидка в 5% за выбор товаров из акционных категорий ", -$discount);
    
    	}
    
    }
    
    add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");

    И скидка в % на суммы от и до:

    function woo_discount_total(WC_Cart $cart) {
    
     	$woo_current_price = $cart->subtotal; // Текущая итоговая сумма
    	
    	if($woo_current_price >= 1000 && $woo_current_price <= 10000) {
    	
    		$discount = $cart->subtotal * 0.03; // 0.03 - это 3%
    		$cart->add_fee("Скидка в 3% за заказ на сумму от 1 000 до 10 000 рублей ", -$discount);
    		
    	} elseif($woo_current_price > 10000) {
    	
    		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
    		$cart->add_fee("Скидка в 5% за заказ на сумму более 10 000 рублей ", -$discount);
    	
    	}
    
    }
    
    add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");

    Вот нужен совместный код.

    Для меня это темный лес, к сожалению.

    Реализовал динамическую скидку - получилось!

    Но вот как сделать чтобы не на все категории она распространялась, а выборочно не представляю(

    Или хотя бы 1 категорию исключить, а на все остальные чтобы действовало...

    Думаю такие 2 скрипта, были бы полезны не только мне, но и многим другим!

    Буду благодарен, если поможете!

      • 1
      1044
        •  Команда Pandoge
      15 фев в 14:20

      smrt.b2b, здравствуйте!

      Нет возможности проверить, но попробуйте этот вариант (и отпишитесь):

      Часть этого комментария скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.

      • 2
      2
        •  Пользователь
      19 фев в 16:49

      Артём Мáлков, спасибо. Уже запилил свой скрипт, на основе ваших)

      Вот что у нас получилось.

      Динамическая скидка в корзине на все категории, кроме одной.

      Фишка в том, что когда, категория, которая исключена из учета скидки лежит в корзине.

      На сумму по этой категории, скидка не считается. В общем теперь работает все как надо)

      Но и вам спасибо за ответ в любом случае) И в особенности скрипты!

      // считает скидку в корзине
      function woo_discount_total(WC_Cart $cart) {
          $excludeFromTotal = 0;
          foreach ($cart->get_cart() as $cart_item) {
              $excludeCategories = ["72", "68", "66", "67", "69", "71", "70"];
              foreach ($excludeCategories as $category) {
                  if (has_term($category, "product_cat", $cart_item['data']->get_parent_id())) {
                      $originalPrice = $cart_item['data']->get_price();
                      $excludeFromTotal += $originalPrice * $cart_item['quantity'];
                      break;
                  }
              }
          }
      
          $woo_current_price = $cart->subtotal - $excludeFromTotal; // Текущая итоговая сумма с учетом категорий в исключениях
      
          if ($woo_current_price >= 3000 && $woo_current_price <= 5000) {
              $discount = $woo_current_price * 0.10; // 0.10 - это 10%
              $cart->add_fee("Скидка в 10% за заказ на сумму от 3 000 до 5 000 рублей ", -$discount);
          } elseif ($woo_current_price > 5000) {
              $discount = $woo_current_price * 0.15; // 0.15 - это 15%
              $cart->add_fee("Скидка в 15% за заказ на сумму более 5 000 рублей ", -$discount);
          }
      }
      
      add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");
      • 1
      1044
        •  Команда Pandoge
      20 фев в 00:13

      Smrt.b2B, рад, что нашли что-то полезное для себя на страницах нашего сайта.

      Удачи в разработке!

    • 1
    2
      •  Пользователь
    3 фев в 12:30

    Артём, спасибо, пользуюсь Вашим кодом на тему "от 3000 руб. скидка 5%, от 15000 руб. скидка 8%". НО!! Возникла проблема. С февраля нужно бить чеки по номенклатуре. Пока в чек при онлайн-оплате шла только общая сумма, она проходила корректно. Теперь же выходит ошибка номер 8, "сумма товаров в корзине не соответствует итоговой сумме". Как сделать так, чтобы при заказе, условно, выше 3000 руб., цены на позиции в заказе снижались сами на 5%. Чтобы эта скидка 5% проходила и попозиционно и в ИТОГО. Помогите, пожалуйста.

      • 1
      1044
        •  Команда Pandoge
      15 фев в 13:29

      Наталья Л, можете прислать скриншот ошибки?

    • 1
    2
      •  Пользователь
    10 дек в 22:59

    Здравствуйте. Использую такой вариант кода скидок:

    function woo_discount_total(WC_Cart $cart) {
     	$woo_current_price = $cart->subtotal; // Текущая итоговая сумма
    		if($woo_current_price >= 3000 && $woo_current_price <= 4999) {
    		$discount = $cart->subtotal * 0.03; // 0.03 - это 3%
    		$cart->add_fee("Скидка 3% за заказ на сумму от 3 000 до 5 000 грн.", -$discount);
    	} elseif($woo_current_price >= 5000 && $woo_current_price <= 7000) {
    		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
    		$cart->add_fee("Скидка 5% за заказ на сумму от 5 000 до 7 000 грн.", -$discount);	
    	} elseif($woo_current_price > 7000) {
    		$discount = $cart->subtotal * 0.07; // 0.07 - это 7%
    		$cart->add_fee("Скидка 7% за заказ на сумму более 7 000 грн.", -$discount);
    		}
    }
    add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");

    Подскажите как вставить ссылку перед словом Скидка? Хочу там установить иконку со ссылкой на страницу сайта с подробными условиями и другими скидками. Для примера, там где галочка должна быль ссылка))

    $cart->add_fee("✅ Скидка 3% за заказ на сумму от 3 000 до 5 000 грн.", -$discount);
      • 1
      1044
        •  Команда Pandoge
      22 дек в 23:48

      Владимир Гнатык, здравствуйте!

      Попробуйте так:

      $cart->add_fee('<a href="/">✅</a> Скидка 3% за заказ на сумму от 3 000 до 5 000 грн.', -$discount);
    • 1
    1
      •  Пользователь
    16 сен в 20:05

    неработают(

    • 2
    1
      •  Пользователь
    16 авг в 00:44
    Динамичная (изменяющаяся в зависимости от итогового количества товаров) скидка в процентах на всю корзинку в WooCommerce

    Можно ли как-то в данной версии, исключить определенные товары из расчета количества?

      • 2
      1044
        •  Команда Pandoge
      22 авг в 22:02

      Dism, здравствуйте!

      Под рукой нет сайта для тестов, но я бы смотрел в сторону

      Фиксированная (применяющаяся при наличии в корзине конкретных товаров) скидка в процентах на всю корзинку в WooCommerce

      Сделал на основе этого ручной подсчет количества при нужных Вам условиях.

      • 1
      1
        •  Пользователь
      23 дек в 00:22

      Артём Мáлков, Артем можешь дать вк я хочу у тебя на счет дле узнать есть вопрос

    • 2
    1
      •  Пользователь
    4 авг в 12:19

    Мне вот интересно, есть ли решение что бы еще и у товаров показывалась новая цена на основе скидки на всю корзину?

      • 1
      1044
        •  Команда Pandoge
      11 авг в 23:43

      Дима Додонов, мне кажется, это невозможно.

      • 1
      2
        •  Пользователь
      3 фев в 12:32

      Артём Мáлков, Это возможно. Посмотрите, пожалуйста, например, на сайте магазина: https://browland.ru

      Там от суммы заказа цена на товар меняется сама собой и попозиционно и в ИТОГО. НЕ понимаю, как такое сделать(

    • 3
    1
      •  Пользователь
    10 июл в 12:36

    Здравствуйте.

    У меня на сайте главная валюта евро и стоит обменный модуль (евро/рубль)

    Нужна скидка на сумму корзины.

    Скажите пожалуйста, Динамичная (изменяющаяся в зависимости от итоговой суммы) скидка в процентах на всю корзинку в WooCommerce, этот скрипт можно использовать ?

    Спасибо.

      • 2
      1044
        •  Команда Pandoge
      22 авг в 21:40

      DenLvov, здравствуйте!

      Я думаю, что да. Условия (скорее всего) нужно прописывать для суммы в евро.

    • 3
    2
      •  Пользователь
    10 июл в 10:58

    Друзья, подскажите пожалуйста, как прописать, чтобы скидка выводилась только пользователям, принадлежащим к определённой группе. Например по id группы или названию.

      • 3
      2
        •  Пользователь
      10 июл в 12:30

      Получение скидки в зависимости от названия группы пользователей, к которым принадлежит user (например к administrator):

      function woo_discount_total(WC_Cart $cart) {
      
      	if(current_user_can('administrator')) {
      		
      		$discount = $cart->subtotal * 0.05; // 0.05 - это 5%
      
      		$cart->add_fee('Фиксированная скидка в 5% ', -$discount);
      	
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees', 'woo_discount_total');
    • 2
    1
      •  Пользователь
    19 июн в 22:19

    Подскажите, пожалуйста, как реализовать применение скидки на странице заказа, введенной клиентом вручную.

    Есть дополнительное поле Скидка на странице заказа. Пользователь вводит в него сумму скидки и нажимает кнопку Применить.

    Вопрос по сути в том, какой код вызвать при нажатии на кнопку Применить. И какой хук использовать для обработки применения скидки.

    • 3
    1
      •  Пользователь
    11 июн в 16:35

    Здравствуйте. А скрипт для динамической скидки в woocommerce 4.2.0 уже не сработает?

      • 3
      1044
        •  Команда Pandoge
      11 авг в 23:44

      dmitrii, Здравствуйте!

      Проверьте и отпишитесь wink

    • 3
    3
      •  Проверенный
    29 апр в 18:30

    Добрый день. Использую: Фиксированная (применяющаяся в зависимости от выбранного способа доставки) скидка в процентах на всю корзинку в WooCommerce

    Вопрос в том как можно сделать чтобы Скидка распределялась только на определенную категорию товаров. Пример: При выборе Самовывоза, скидка 30% распределяется только на категорию Пиццы, а кофе, напитки и другие категории оставалась старая стоимость.

      • 1
      1044
        •  Команда Pandoge
      29 апр в 20:24

      Александр Куц, здравствуйте!

      В статье есть вариант и для категорий. Вы пробовали соединять код?

      • 2
      3
        •  Проверенный
      2 мая в 00:37

      Артём Мáлков, проблема в том что скидка считается на всю корзину. А мне необходимо:

      Пицца 1 - 100 грн

      Пицца 2 - 100 грн

      Кофе - 50 грн.

      Даже при объединении кодов считает 30% Скидки от 250 грн. А надо чтобы скидка считалась на Пиццу 1 и Пиццу 2. А стоимость кофе оставалось 50 грн.

      • 2
      1044
        •  Команда Pandoge
      2 мая в 09:29

      Александр Куц, значит Вам нужна не скидка, а переопределение цены товара. Об этом будет отдельная статья.

      • 1
      1
        •  Пользователь
      2 мая в 19:18

      Артём Мáлков, Добрый вечер.

      Такой же вопрос.

      Очень ждём статью о переопределении :)

      • 1
      3
        •  Проверенный
      5 мая в 13:19

      Артём Мáлков, Спасибо большое, очень жду. А можете сориентировать когда примерно планируете её публикацию?

      • 6
      2
        •  Пользователь
      16 мая в 12:56

      Артём Мáлков, спасибо за вашу работу и помощь! Тоже столкнулся с такой необходимостью - при выборе самовывоза, скидка 10% считалась только на определенные категории товаров, или наоборот скидка на самовывоз 10% на все категории, кроме категории допустим НАПИТКИ и СОУСЫ, заранее спасибо!

      • 1
      2
        •  Пользователь
      18 ноя в 10:39

      Артём Мáлков, добрый день, очень ждем отдельную статью )) очень уж распространенная проблема

    • 2
    3
      •  Пользователь
    27 апр в 16:18

    Здравствуйте, подскажите, пожалуйста, как можно сделать, чтобы применяемая скидка на всю корзину не суммировалась со скидкой, которая уже указана на товаре?

    Использую код такой:

    function woo_discount_total(WC_Cart $cart) {
    
    	$wo_current_price = $cart->subtotal;
    	
    	if($wo_current_price >= 5000 && $wo_current_price < 9999) {
    	
    		$discount = $cart->subtotal * 0.05;
    		$cart->add_fee("Скидка в 5% за заказ на сумму от 5 000 до 10 000 рублей", -$discount);
    		
    	} elseif($wo_current_price >= 10000 && $wo_current_price < 14999) {
    	
    		$discount = $cart->subtotal * 0.07;
    		$cart->add_fee("Скидка в 7% за заказ на сумму от 10 000 до 15 000 рублей", -$discount);
    		
    	} elseif($wo_current_price >= 15000 && $wo_current_price < 19999) {
    	
    		$discount = $cart->subtotal * 0.09;
    		$cart->add_fee("Скидка в 9% за заказ на сумму от 15 000 до 20 000 рублей", -$discount);
    		
    	} elseif($wo_current_price >= 20000 && $wo_current_price < 24999) {
    	
    		$discount = $cart->subtotal * 0.11;
    		$cart->add_fee("Скидка в 11% за заказ на сумму от 20 000 до 25 000 рублей", -$discount);
    		
    	} elseif($wo_current_price >= 25000 && $wo_current_price < 29999) {
    	
    		$discount = $cart->subtotal * 0.13;
    		$cart->add_fee("Скидка в 13% за заказ на сумму от 25 000 до 30 000 рублей", -$discount);
    		
    	} elseif($wo_current_price >= 30000 && $wo_current_price < 49999) {
    	
    		$discount = $cart->subtotal * 0.15;
    		$cart->add_fee("Скидка в 15% за заказ на сумму от 30 000 до 50 000 рублей", -$discount);
    		
    	} elseif($wo_current_price >= 50000) {
    	
    		$discount = $cart->subtotal * 0.20;
    		$cart->add_fee("Скидка в 20% за заказ на сумму более 50 000 рублей", -$discount);
    		
    	}
    	
    }
    
    add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");

    Что нужно добавить для выполнения данных условий? Как правильно это написать? smiley

      • 1
      1044
        •  Команда Pandoge
      8 мая в 00:05

      Юлия, здравствуйте! Попробуйте так.

      1. После строки:

      $wo_current_price = $cart->subtotal;

      Добавьте:

      $cart_subtotal = $cart->subtotal;
      
      foreach($cart->get_cart() as $hash => $value) {
      			
      	if($value['data']->get_sale_price() != '') {
      				
      		$cart_subtotal = $cart_subtotal - $value['data']->get_sale_price() * $value['quantity'];
      					
      	}
      
      }

      2. Во всех условиях часть:

      $discount = $cart->subtotal * 

      замените на:

      $discount = $cart_subtotal * 
      • 2
      3
        •  Пользователь
      27 мая в 13:24

      Артём Мáлков, благодарю, попробую. Расскажу результат)

      • 2
      3
        •  Пользователь
      6 июн в 01:14

      Артём Мáлков, как и обещала рассказать про работоспособность кода. Очень благодарна Вам. Всё изменила как рассказали. В итоге всё работает!

    • 2
    1
      •  Пользователь
    17 дек в 14:09

    Спасибо Артем! Очень полезные функции! Один вопрос - нужно сделать так чтобы эта функция работала только если отмечен самовывоз. Т.е. при самовывозе активировалась скидка 10%. Реально?

      • 4
      1044
        •  Команда Pandoge
      23 янв в 03:29

      Андрей С., здравствуйте!

      Извините за поздний ответ. Обновили статью.

    • 1
    5
      •  Проверенный
    25 ноя в 01:17

    Здравствуйте!

    А как написать что бы допустим При покупке щетки(1 категория) + насадка (другая категория) скидка 5% и при этом отключать купоны

      • 1
      1044
        •  Команда Pandoge
      25 ноя в 01:37

      Ксения Сова, здравствуйте.

      Вам нужно условие товар 1 + товар 2 = скидка?

      • 1
      5
        •  Проверенный
      25 ноя в 10:46

      Артем Мáлков, да

      Один определенный товар + второй определенный товар ну или 2 определенных категории в связке

      • 1
      1044
        •  Команда Pandoge
      27 ноя в 03:57

      Ксения Сова, здравствуйте!

      Обновил статью. Надеюсь добавленные варианты скидок помогут решить Ваши задачи. smiley

      • 4
      5
        •  Проверенный
      27 ноя в 18:48

      Артём Мáлков, Спасибо большое kitty

    • 3
    2
      •  Пользователь
    10 окт в 14:12

    Поставил, работает, ура!) А не подскажите как сделать чтобы скидка применялась только к товарам из конкретной категории ID=107 , а ко всем остальным товарам не считалась?

    • 1
    1
      •  Пользователь
    15 июл в 12:24

    подскажите, использую второй вариант скидки, можно ли его применить только к конкретному типу доставки?

      • 5
      1044
        •  Команда Pandoge
      10 окт в 14:47

      Владислам, в ближайшее время дополним статью.

    • 2
    1
      •  Пользователь
    12 июн в 19:48

    Добрый день! Подскажите пожалуйста,как можно реализовать купон скидка на набор трех определенных товаров разной стоимости по одной цене.Например, три пиццы за 700 руб. по промокоду.

      • 3
      1044
        •  Команда Pandoge
      13 июн в 02:04

      Сергей, здравствуйте. Не совсем понял.

      Вам нужно, чтобы три определенных товара, которые имеют разную цену, можно было купить с промокодом по одной общей цене?

    • 1
    1044
      •  Команда Pandoge
    7 июн в 22:39

    Статья обновлена.

    Добавлен еще один вид динамичной скидки.

    • 1
    4
      •  Проверенный
    26 фев в 15:46

    Добрый день! Огромное спасибо! Я не силен в таких штукенциях, подскажите какие строки скопировать и вставить, мне нужны 4 вида фиксированных скидок, типа от 1 до 2, от 2 до 3 и т.д. Спасибо.

      • 2
      1044
        •  Команда Pandoge
      26 фев в 16:00

      Василий Салогрев, не совсем понял. 1, 2, 3 - это разные суммы для которых делать скидку?

      • 1
      4
        •  Проверенный
      26 фев в 16:48

      Скидка 3 % 50000 до 150000

      5% 150000 до 300000

      7% 300000 до 500000

      10% от 500000

      • 1
      4
        •  Проверенный
      26 фев в 17:20

      В скрипте опечатка - за заказа)

      • 2
      4
        •  Проверенный
      26 фев в 17:25

      Все, разобрался, огромное спасибо за скрипт!

      • 3
      1044
        •  Команда Pandoge
      26 фев в 17:27

      Василий Салогрев, пробуйте:

      function woo_discount_total(WC_Cart $cart) {
      
       	$wo_current_price = $cart->subtotal;
      	
      	if($wo_current_price >= 50000 && $wo_current_price < 149999) {
      	
      		$discount = $cart->subtotal * 0.03;
      		$cart->add_fee("Скидка в 3% за заказ на сумму от 50 000 до 150 000 рублей", -$discount);
      		
      	} elseif($wo_current_price >= 150000 && $wo_current_price < 299999) {
      	
      		$discount = $cart->subtotal * 0.05;
      		$cart->add_fee("Скидка в 5% за заказ на сумму от 150 000 до 300 000 рублей", -$discount);
      	
      	} elseif($wo_current_price >= 300000 && $wo_current_price < 499999) {
      	
      		$discount = $cart->subtotal * 0.07;
      		$cart->add_fee("Скидка в 7% за заказ на сумму от 300 000 до 500 000 рублей", -$discount);
      	
      	} elseif($wo_current_price >= 500000) {
      	
      		$discount = $cart->subtotal * 0.10;
      		$cart->add_fee("Скидка в 10% за заказа на сумму более 500 000 рублей", -$discount);
      	
      	}
      
      }
      
      add_action("woocommerce_cart_calculate_fees" , "woo_discount_total");
      • 1
      1044
        •  Команда Pandoge
      26 фев в 17:30

      Василий Салогрев, да, увидели опечатку. Спасибо. smiley

    • 2
    766
      •  Гости
    8 ноя в 07:05

    Всем привет!

    Подскажите пожалуйста Как правильно подключить checkbox Хочу скидку 3% при оплате картой онлайн?

    пробывал сделать так

    function add_discount($cart)

    {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) || is_cart() ) {

    return;

    }

    if (WC()->session->chosen_payment_method == 'bacs') {

    $cart->add_fee( 'Скидка за метод', - $cart->cart_contents_total * 0.1 );

    }

    }

    add_action( 'woocommerce_cart_calculate_fees', 'add_discount' , 10 );

    но оно не работает(

      • 2
      1044
        •  Команда Pandoge
      8 ноя в 12:00

      иван, попробуйте так:

      function add_discount(WC_Cart $cart) {
      	
      	if(is_admin() && !defined("DOING_AJAX") || is_cart()) {
      	
      		return;
      		
      	}
      
      	if(WC()->session->get("chosen_payment_method") == "bacs") {
      	
      		$cart->add_fee("Скидка за метод", -$cart->cart_contents_total * 0.1);
      		
      	}
      
      }
      
      add_action("woocommerce_cart_calculate_fees", "add_discount");
    • 3
    766
      •  Гости
    25 окт в 11:31

    Спасибо, работает!

    А как сделать, чтобы информация о скидке: "Скидка в 5% за заказ на сумму более 10 000 руб" - отображалась в корзине независимо от суммы заказа?

    Это будет стимулировать покупателя набрать нужную сумму.

    А то сейчас он узнает о скидке только после того, как выполнил необходимые условия, а нужно, чтобы он видел эту информацию до достижения требуемой суммы.

      • 1
      1044
        •  Команда Pandoge
      25 окт в 15:50

      4memo, для этого нужно внести правки в файл корзины. Под рукой нет к сожалению сайта на WP, не могу подсказать.

    • 2
    766
      •  Гости
    17 авг в 10:00

    Это чудо, это работает. Устала искать плагины для этого дела, все платные и очень дорогие! И такое простое решение!! Спасибо огромное!!!!!!!

Подняться наверх
«Pandoge» - помощник вебмастера