Безлимитный хостинг на сверхбыстрых SSD-дисках от 57р в месяц   •   Реклама
10 896 просм
25 комм
Поделиться:

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

23 янв
Хаки

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

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

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

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

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

function woo_discount_total(WC_Cart $cart) {

	$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) {

	$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) {

	$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) {

	$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) {

	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) {

	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) {

	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) {

	$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) {

	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) {

	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) {

 	$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) {

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

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

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

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

      • 0
      802
        •  Администратор
      23 янв в 03:29

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

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

    • 0
    3
      •  Проверенный
    25 ноя в 01:17

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

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

      • 0
      802
        •  Администратор
      25 ноя в 01:37

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

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

      • 0
      3
        •  Проверенный
      25 ноя в 10:46

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

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

      • 0
      802
        •  Администратор
      27 ноя в 03:57

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

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

      • 1
      3
        •  Проверенный
      27 ноя в 18:48

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

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

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

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

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

      • 3
      802
        •  Администратор
      10 окт в 14:47

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

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

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

      • 0
      802
        •  Администратор
      13 июн в 02:04

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

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

    • 0
    802
      •  Администратор
    7 июн в 22:39

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

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

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

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

      • 1
      802
        •  Администратор
      26 фев в 16:00

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

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

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

      5% 150000 до 300000

      7% 300000 до 500000

      10% от 500000

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

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

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

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

      • 1
      802
        •  Администратор
      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");
      • 0
      802
        •  Администратор
      26 фев в 17:30

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

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

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

      • 0
      802
        •  Администратор
      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");
    • 1
    766
      •  Гости
    25 окт в 11:31

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

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

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

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

      • 0
      802
        •  Администратор
      25 окт в 15:50

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

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

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

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