Артём Мáлков

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

23 янв132 комм

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, который находится в папке вашей темы.

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

Рекомендуем к просмотру
Разрешаем добавление только одного товара в корзину в WooCommerce
Хаки
Скидка купона в WooCommerce на всю корзину, включая способ доставки
Статьи и советы
Получаем общее количество товаров в корзине и их сумму в WooCommerce в WordPress
Посты
132
комментария
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 0
    1
      •  Пользователь
    30 окт в 20:13

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

    Применил

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

    Все работало,до того момента как подключили СДЭК (рассчитать стоимость с доставкой)

    Теперь расчет стоимости с доставкой от СДЭК показывается

    а скидка в 5% исчезла.Не показывается вообще.

    Не подскажете,есть ли решение,что нужно прописать?

    Благо Дарю за ответ.

    • 1
    1
      •  Пользователь
    30 июн в 08:29

    День добрый. Подскажите как можно реализовать скидки таким образом чтобы не из суммы корзины делать скидки а именно из суммы товара. Допустим у нас есть магазин мы продаем экипировку для самбо, дзюдо, карате. Мы хотим реализовать скидку на комплект для самбо (куртка+шорты - 10%, куртка+шорты+борцовки 15%). Но суть в том что если в корзине будет экипировка для дзюдо то скидка дается и на этот товар. Заранее спасибо за ответ

      • 0
      1066
        •  Команда Pandoge
      16 июл в 13:00

      Кадыров Олимджон, здравствуйте!

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

    • 0
    1
      •  Пользователь
    9 мая в 13:06

    Артем, здравствуйте. Не могли бы вы помочь? Если за это взимается плата, готов оплатить. Сама суть вопроса - Мне надо чтобы "Фиксированная скидка в процентах на всю корзинку в WooCommerce" применялась также как и у вас указанно в статье, но чтобы товары которые уже идут по скидке не учитывались, то есть товары которые без скидки на них идет 10 процентов скидка, а товары которые уже были на сайте со скидкой не действовала эта скидка и они бы шли как были. Как бы применяет скидку на все товары в 10 процентов, но не трогает товары которые уже были на сайте со скидкой. И если можно чтоб это работало при выборе оплата при доставке, а на самовывоз не действовала бы. Очень срочно надо, надеюсь на вашу помощь

      • 0
      1066
        •  Команда Pandoge
      16 июл в 12:58

      Анджело Урсо, здравствуйте!

      Скрипт для вашей задачи будет выглядеть следующим образом:

      function woo_discount_total(WC_Cart $cart) {
      
      	if(is_admin() && !defined('DOING_AJAX')) {
      	
      		return;
      		
      	}
      
      	global $woocommerce;
      
      	$payment_selected = '';
      
      	$delivery_name = '';
      	$delivery_selected = [];
      	$available_methods = $woocommerce->shipping->get_packages();
      
      	if(isset($woocommerce->session)) {
      
      		$delivery_selected = $woocommerce->session->get('chosen_shipping_methods');
      
      		$payment_selected = $woocommerce->session->get('chosen_payment_method');
      
      	}
      
      	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; // Общая сумма товаров
      
      	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']; // Вычитаем его акционную стоимость с учётом количества из итоговой цены
      
      		}
      
      	}
      
      	if($cart_subtotal > 0 && $payment_selected == 'cod' && $delivery_name != 'Самовывоз') {
      
      		// Если оставшаяся итогая сумма товаров с учётом исключений больше 0, выбран способ оплаты "Оплата при доставке" и выбрана доставка не самовывоз
      
      		$discount = $cart_subtotal * 0.1; // Скидка 10% от оставшейся суммы товаров
      
      		$cart->add_fee('Скидка 10%', -$discount);
      	
      	}
      
      }
      
      add_action('woocommerce_cart_calculate_fees', 'woo_discount_total');

      Здесь есть нюанс: корзина не обновляется при выборе способа оплаты. Из-за этого, предложенный скрипт не может рассчитать актуальные параметры корзины. Чтобы это исправить, в главный файл JS вашей темы добавьте:

      $(document).on("change", 'input[name="payment_method"]', function() {
      	
      	$("body").trigger("update_checkout");
      
      });
    • 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
      1066
        •  Команда Pandoge
      16 июл в 12:28

      Лора Зедрина, здравствуйте! В стандартном шаблоне WooCommerce в корзине не выводится вес товаров, хотя могу ошибаться. Подскажите, в каком месте у вас выводится эта информация?

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

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

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

      • 0
      1066
        •  Команда Pandoge
      16 июл в 12:21

      Ержан Садыков, здравствуйте! Подумаю над этим на досуге. Скорее всего, будет отдельный пост

    • 2
    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
      1066
        •  Команда 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');
    • 1
    1
      •  Пользователь
    28 дек в 07:01

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

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

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

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

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

    Добрый день.

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

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

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

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

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

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

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

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

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

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

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

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

      Да, верно.

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

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

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

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

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

      • 1
      1066
        •  Команда 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
      11
        •  Пользователь
      20 сен в 16:19

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      • 1
      1066
        •  Команда 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
      11
        •  Пользователь
      24 сен в 00:11

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

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

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

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

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

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

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

      • 0
      1
        •  Пользователь
      19 апр в 19:05

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

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

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

      • 0
      11
        •  Пользователь
      29 апр в 18:23

      Артём Мáлков, очень прошу Вашей помощи! Буду благодарна за Ваш ответ!

      • 2
      11
        •  Пользователь
      24 мая в 08:46

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

      Можете, пожалуйста, помочь с усовершенствованием кода.

      Очень нужна Ваша помощь

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

      То есть клиент могу выбрать либо скидку, либо применение купона (подарок).

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

      • 1
      1066
        •  Команда Pandoge
      16 июл в 15:55

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

      Строку:

      if($delivery_name == 'Самовывоз' && $cart_subtotal > 0) {

      замените на:

      if($delivery_name == 'Самовывоз' && $cart_subtotal > 0 && count($woocommerce->cart->get_applied_coupons()) == 0) {
    • 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');
      • 3
      1066
        •  Команда Pandoge
      9 июл в 00:58

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

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

       || is_cart()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      • 3
      1066
        •  Команда 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
      1066
        •  Команда 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');
    • 4
    3
      •  Пользователь
    30 апр в 15:02

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

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

    от 500 минус 10%

    от 2000 минус 20%

    от 10000 минус 30%

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

      • 1
      1066
        •  Команда 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'])) {

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

    • 4
    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");
    • 3
    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%

    • 2
    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");
      • 2
      1066
        •  Команда Pandoge
      5 апр в 23:43

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

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

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

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

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

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

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

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

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

    • 2
    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
      1066
        •  Команда 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
      1066
        •  Команда 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
      1066
        •  Команда 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
      1066
        •  Команда 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
      1066
        •  Команда Pandoge
      20 фев в 00:13

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

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

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

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

      • 1
      1066
        •  Команда 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
      1066
        •  Команда 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
      1066
        •  Команда Pandoge
      22 авг в 22:02

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Спасибо.

      • 2
      1066
        •  Команда 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
      1066
        •  Команда Pandoge
      11 авг в 23:44

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

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

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

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

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

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

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

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

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

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

      Пицца 1 - 100 грн

      Пицца 2 - 100 грн

      Кофе - 50 грн.

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

      • 2
      1066
        •  Команда 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
      1066
        •  Команда 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
      1066
        •  Команда Pandoge
      23 янв в 03:29

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      • 2
      1066
        •  Команда 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
      1066
        •  Команда 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
      1066
        •  Команда 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
      1066
        •  Команда 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
      1066
        •  Команда Pandoge
      25 окт в 15:50

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

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

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

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