Скидка в процентах на всю корзину без купона в WooCommerce
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, который находится в папке вашей темы.
По желанию (в двух последних вариантах) вы можете задать свои диапазоны цен.