/ Плагины / Акция 20% на каждый второй и 30% на каждый 3 товар

Акция 20% на каждый второй и 30% на каждый 3 товар

HIT

02.06.2021

1164

Немного измененный и доработанный вариант акции (20% на 3 товар, 30% на 4 товар).

В данном случае немного изменен принцип применения акции. Если в предыдущем примере акция применялась буквально к каждому 3 и к каждому 4 товару, то в данном случае акция применяется к каждой следующей тройке товаров, ко второму и третьему соответственно. Также сделано экранирование, не учитывать акцию если нет товар из нужной категории, ранее выводились ошибки.

Как и ранее первая скидка применяются к самому дешевому товару и все последующие применяются к товарам с ценой по возрастанию.

Доработано: если у товара несколько категорий и только одна из них должна быть акционной (например stock).

Расчет суммы акции

// Акция 2-20, 3-30

add_action( 'woocommerce_cart_calculate_fees','wc_custom_surcharge', 10, 1 );
function wc_custom_surcharge( $cart ) {
	
	if ( is_admin() && ! defined( 'DOING_AJAX' ) )
	return;
	
	foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
		
		$_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
		
		if ( $_product->get_type() == 'simple' ) {
			
			$terms = get_the_terms( $_product->get_ID(), 'product_cat' );
			
		} elseif ( $_product->get_type() == 'variation' ) {
			
			$variation = wc_get_product($_product->get_ID());
			$varproduct = wc_get_product( $variation->get_parent_id() );
			$terms = get_the_terms( $varproduct->get_ID(), 'product_cat' );
			
		}
		
		foreach ($terms as $term) {
			$terms_slug[] = $term->slug;
		}
		
		if ( in_array('stock', $terms_slug) ) { // если категория stock
		
			// создаем столько цен сколько единиц товара
			$prices[] = array_fill(0, $cart_item['quantity'], $_product->get_price());
		
		}
		
	}	
	
	if (isset($prices)) {
		
		// объединяем в один массив цен
		$all_prices = array();
		foreach ($prices as $child) {
			$all_prices = array_merge($all_prices, $child);
		}	

		sort($all_prices); // цены в порядке возрастания

		//print_r($all_prices);

		// вычислить количество скидок

		if ( count($all_prices) >= 2 ) {

			$i = 0;	
			$n = 0; // период
			$actions_count = 0;

			foreach ($all_prices as $cus_price) {

				$i++;

				if ( $i == 2 + 3 * ($n) ) { // число соответствует формуле

					$actions_count++;

				}		

				if ($i % 3 == 0) { // кратно 3

					$actions_count++;
					$n++;
				}			

			}	
		}

		//применить скидки к ценам в порядке возрастания

		if ( count($all_prices) >= 2 ) {

			$fee_descript = 'Скидка 20% за каждый второй и 30% за каждый третий товары';
			$fee = 0;

			$i = 0;

			foreach ($all_prices as $cus_price) {

				$i++;

				if ($i <= $actions_count) { // соответствует количеству примененных скидок

					if ($i % 2 != 0) { // нечетные

						$all_actions_price[] = $cus_price * 0.2;

					} else {

						$all_actions_price[] = $cus_price * 0.3;

					}

				}

			}

			$fee = round(array_sum($all_actions_price), 2);

			$cart->add_fee( __($fee_descript, 'woocommerce'), -$fee, true );

		}		
		
	}
	
}

Вывод уведомления и общей суммы акции

// Вывести информацию о скидке в корзине перед Итого
add_action( 'woocommerce_before_cart_totals','print_message_wc_custom_surcharge', 7, 1 );

function print_message_wc_custom_surcharge() {
	
	foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
		
		$_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
		
		if ( $_product->get_type() == 'simple' ) {
			
			$terms = get_the_terms( $_product->get_ID(), 'product_cat' );
			
		} elseif ( $_product->get_type() == 'variation' ) {
			
			$variation = wc_get_product($_product->get_ID());
			$varproduct = wc_get_product( $variation->get_parent_id() );
			$terms = get_the_terms( $varproduct->get_ID(), 'product_cat' );
			
		}
		
		foreach ($terms as $term) {
			$terms_slug[] = $term->slug;
		}
		
		if ( in_array('stock', $terms_slug) ) { // если категория stock
		
			// создаем столько цен сколько единиц товара
			$prices[] = array_fill(0, $cart_item['quantity'], $_product->get_price());
		
		}
		
	}	
	
	if (isset($prices)) {
	
		// объединяем в один массив цен
		$all_prices = array();
		foreach ($prices as $child) {
			$all_prices = array_merge($all_prices, $child);
		}	

		sort($all_prices);

		$action_20_count = floor(count($all_prices) / 2 );
		$action_30_count = floor(count($all_prices) / 3 );
		$actions_count = $action_20_count + $action_30_count;

		// Убием каждую 6 скидку т.к. они дублируются на одном товаре (6, 12, 18 и т.д.)
		if ($actions_count % 6 == 0) {
			$actions_count = $actions_count - ($actions_count / 6);
		}	

		$symbol = get_woocommerce_currency_symbol('RUB');

		// определить количество скидок

		if ( count($all_prices) >= 2 ) {

			$i = 0;	
			$n = 0; // период
			$actions_count = 0;

			foreach ($all_prices as $cus_price) {

				$i++;

				if ( $i == 2 + 3 * ($n) ) { // число соответствует формуле

					$actions_count++;

				}		

				if ($i % 3 == 0) { // кратно 3

					$actions_count++;
					$n++;
				}			

			}

		}	

		// применить скидки

		if ( count($all_prices) >= 2 ) {

			echo '<div class="discount-message">';

			$i = 0;	
			$n = 0; // период

			foreach ($all_prices as $cus_price) {

				$i++;

				if ($i <= $actions_count) { // соответствует количеству примененных скидок

					if ($i % 2 != 0) { // нечетные

						$all_actions_price[] = $cus_price * 0.2;

					} else {

						$all_actions_price[] = $cus_price * 0.3;

					}

				}

			}

			$skidka = round(array_sum($all_actions_price), 2);

			echo '<p>Скидка 20% за каждый второй и 30% за каждый третий товары: <strong><bdi>'.$skidka.' '.$symbol.'</bdi></strong></p>';

			echo '</div>';

		}
		
	}

}

Отображение скидки у каждой позиции в корзине

add_filter( 'woocommerce_cart_item_subtotal', 'bbloomer_if_coupon_slash_item_subtotal', 99, 3 );
 
function bbloomer_if_coupon_slash_item_subtotal( $subtotal, $cart_item_cus ){
	
	foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
		
		$_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
		
		if ( $_product->get_type() == 'simple' ) {
			
			$terms = get_the_terms( $_product->get_ID(), 'product_cat' );
			
		} elseif ( $_product->get_type() == 'variation' ) {
			
			$variation = wc_get_product($_product->get_ID());
			$varproduct = wc_get_product( $variation->get_parent_id() );
			$terms = get_the_terms( $varproduct->get_ID(), 'product_cat' );
			
		}
		
		foreach ($terms as $term) {
			$terms_slug[] = $term->slug;
		}
		
		if ( in_array('stock', $terms_slug) ) { // если категория stock
		
			// создаем столько цен сколько единиц товаров
			
			for ($i = 1; $i <= $cart_item['quantity']; $i++) {
				$prices[] = array(
					'cust_id' => $_product->get_ID(), 
					'cust_price' => $_product->get_price()
				);
			}
		
		}
		
	}
	
	if (isset($prices)) {
	
		// сортировка 2-х мерного массива по ключу
		usort($prices, function($a, $b) {
			return $a['cust_price'] <=> $b['cust_price'];
		});

		$action_20_count = floor(count($prices) / 2 );
		$action_30_count = floor(count($prices) / 3 );
		$actions_count = $action_20_count + $action_30_count;

		// Убием каждую 6 скидку т.к. они дублируются на одном товаре (6, 12, 18 и т.д.)
		if ($actions_count % 6 == 0) {
			$actions_count = $actions_count - ($actions_count / 6);
		}

		// определить количество скидок

		if ( count($prices) >= 2 ) {

			$i = 0;
			$n = 0; // период
			$actions_count = 0;

			foreach ($prices as $cust_price) {

				$i++;
				//echo 2 + 3 * ($n);

				if ( $i == 2 + 3 * ($n) ) { // число соответствует формуле  + 3 * ($n - 1)
					$actions_count++;
				}	

				if ($i % 3 == 0) { // кратно 3
					$actions_count++;				
					$n++;
				}	

			}

		}	

		// применить скидки

		if ( count($prices) >= 3 ) {

			$i = 0;	

			foreach ($prices as $cust_price) {

				$i++;

				if ($i <= $actions_count) { // соответствует количеству примененных скидок

					if ($i % 2 != 0) { // нечетные

						$all_actions_price[] = array (
							'cust_id' => $cust_price['cust_id'], 
							'cust_action' => $cust_price['cust_price'] * 0.2						
						);

					} else {

						$all_actions_price[] = array (
							'cust_id' => $cust_price['cust_id'], 
							'cust_action' => $cust_price['cust_price'] * 0.3						
						);

					}

				}

			}

		}
		
	}
	
	
	if (isset($all_actions_price)) {
		foreach ($all_actions_price as $row) {
		
			if ( !isset( $results[$row['cust_id']] ) ) {
				$results[$row['cust_id']] = $row;
			} else {
				$results[$row['cust_id']]['cust_action'] .= ',' . $row['cust_action'];
			}

		}
	}
	

	if (isset($results)) {
		foreach ($results as $result) {

			$line_total_discount = array_sum( explode( ',', $result['cust_action'] ) );

			if ( $cart_item_cus['data']->get_ID() == $result['cust_id'] ) {

				$line_total = $cart_item_cus['data']->get_price() * $cart_item_cus['quantity'];

				$newsubtotal = wc_price( $line_total - $line_total_discount ); 
				$subtotal = sprintf( '<del>%s</del> %s', $subtotal, $newsubtotal ); 
			}

		}
	}

	return $subtotal;
}
[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Кастомный метод платежа

Кастомный метод платежа

Создадим собственный метод платежа. Это может быть простой не предусмотренный изначально в WC метод: оплата курьеру картой, квитанция и прочие. Добавление подобных способов оплаты поможет на более раннем этапе понять Читать далее »

Конвертировать цену в рубли

Конвертировать цену в рубли

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

Обзор плагинов по созданию скидок

Обзор плагинов по созданию скидок

Рассмотрим различные плагины по созданию функционала скидок. Рассматриваться будут плагины которые предоставляют возможность комплексного формирования скидок на состав корзины. Практически все плагины в обзоре могут в бесплатной версии предоставить простой Читать далее »

Добавить комментарий

Notice: Функция WP_Styles::add вызвана неправильно. Стиль с дескриптором "editor-buttons" был поставлен в очередь с незарегистрированными зависимостями: dashicons. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 6.9.1.) in /home/t/tiberi6w/opttour.ru/public_html/wp-includes/functions.php on line 6260

Пока нет комментариев. Будь первым!

Акция 20% на каждый второй и 30% на каждый 3 товар
Создание динамических графиков
Рекомендации для васСоздание динамических графиковOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.