/ Сайтостроение / Плагины / Цены в зависимости от группы пользователей

Цены в зависимости от группы пользователей

HIT

14.12.2017

1047

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

WC Role Based Price

Плагин WC Role Based Price (6000) реализует это с помощью дополнительных полей в карточке товара. В настройках плагина мы выбираем роли, для которых цены могут отличаться. В бесплатной версии плагина это все. Pro версия за $59 предлагает такие дополнения:

  • Расписание скидки (в стандартном магазине это итак реализовано, но тут предлагается и для скидки для конкретной группы)
  • Динамическая цена (?)
  • Блокировка определенного способа оплаты в зависимости от роли
  • Блокировка товара оплаты в зависимости от роли
  • Таблица со списком ролей и цен
  • Сопряжен с переключением валют
  • Сопряжен с массовым изменением цен
  • Сопряжен с плагином WP All Import (можно импортировать цены)

WooCommerce Wholesale Prices (9000)

Предоставляет цену для оптовых покупателей, создавая особую роль Оптовый клиент. В админке: в товаре появляется новое поле — Wholesale Customer, а при выборе товаров колонку с оптовой ценой. В бесплатной версии все настройки заблокированы. Premium версия стоит 59 долларов, расширяет функционал:

  • Оптовые цены в WooCommerce
    Простота управления оптовой ценой по ролям пользователей. Глобальная скидка (%), скидка на категории (%) или индивидуальная оптовая цена.
  • Доставка, Налоговые и платежные шлюзы обрабатываются отдельно
    Назначить способы доставки и оплаты для оптовых клиентов.
  • Настройки каталог для оптовых клиентов
    Создание товаров «Только опт». Скрыть товары «Только розница» от оптовиков. Создание вариаций «Только опт».
  • Правила минимальной покупки
    Обеспечьте предварительную обработку заказа до оптового ценообразования. Минимальное количество товаров, которые нужно заказать. Минимальное количество отдельных товаров.

Woocommerce Role Pricing (1000)

Плагин не создает дополнительного поля цены у товаров. А воздействует глобально на все цены магазина в зависимости от роли.
Настройки метода: Выбираем метод скидки — ставка или количество. Применить для — основная цена или акционная цена. Выбираем — скидки или суммы.
Во вкладке роли выставляем коэффициент скидки для каждой из ролей.

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

Как это исправить:

В файле woocommerce-role-pricing/core/class-woorolepricinglight.php находим строки:

$type = get_option( "wrp-method", "rate" );
$result = 0;
if ($type == "rate") {

И все что идет в фигурных скобках оборачиваем в условие:

if ( $product->is_on_sale() ) {
	
	$result = $product->get_sale_price();						
	
} else {
	
	// if rate and price includes taxes
	if ( $product->is_taxable() && get_option('woocommerce_prices_include_tax') == 'yes' ) {
		$_tax       = new WC_Tax();
		$tax_rates  = $_tax->get_shop_base_rate( $product->get_tax_class() );
		$taxes      = $_tax->calc_tax( $baseprice, $tax_rates, true );
		$product_price      = $_tax->round( $baseprice - array_sum( $taxes ) );
	}

	$result = self::bcmul($product_price, $commission, WOO_ROLE_PRICING_LIGHT_DECIMALS);

	if ( $product->is_taxable() && get_option('woocommerce_prices_include_tax') == 'yes' ) {
		$_tax       = new WC_Tax();
		$tax_rates  = $_tax->get_shop_base_rate( $product->get_tax_class() );
		$taxes      = $_tax->calc_tax( $result, $tax_rates, false ); // important false
		$result      = $_tax->round( $result + array_sum( $taxes ) );
	}
	
}

Вывод базовой цены в этом плагине предполагается только в Pro версии (19$). Функция по выводу базовой цены:

// Вывести базовую цену
function woocommerce_low_cost() { 
	global $current_user;
    $user_roles = $current_user->roles;
    $user_role = array_shift($user_roles);
	if ( !empty($user_role) ){
	if ( $user_role != 'administrator' ){
		global $product;
		if ( !$product->is_on_sale() ){
			echo '';
			echo $product->get_regular_price();
			echo '';
		}
	}
	}
};
add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_low_cost', 15 );

Функция по выводу разницы «Ваша скидка» + вывод в карточке товара:

// Вывести базовую цену
function woocommerce_low_cost() { 
	global $current_user;
    $user_roles = $current_user->roles;
    $user_role = array_shift($user_roles);
	if ( !empty($user_role) ){
		global $product;
		if ( !$product->is_on_sale() ){
			echo '<small class="role-sale">Скидка: ';
			$skidka = $product->get_regular_price() - $product->get_price();
			echo $skidka;
			echo ' руб.</small>';
		}
	}
};
add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_low_cost', 15 );
add_action( 'woocommerce_single_product_summary', 'woocommerce_low_cost', 15 );

Вычисляем общую сумму без скидки (этот код я вставляю напрямую в шаблон woocommerce/cart/cart-totals.php):

cart->get_cart() as $cart_item_key => $cart_item ) {
		$_product   = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
		$product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );
			
		if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
			$product_permalink = apply_filters( 'woocommerce_cart_item_permalink', $_product->is_visible() ? $_product->get_permalink( $cart_item ) : '', $cart_item, $cart_item_key );
	
			$is_on_sale = $cart_item[data]->sale_price;
			if ( !empty($is_on_sale) ){
				$proprice = $cart_item[data]->sale_price;
				$proqt = $cart_item['quantity'];
			} else {
				$proprice = $cart_item[data]->regular_price;
				$proqt = $cart_item['quantity'];
			}
			$prototal[] = $proprice * $proqt;
		}
	}
	global $woocommerce;
	$basetotal = $woocommerce->cart->get_cart_total();
	$basetotalnum = preg_replace("/[^0-9]/", '', $basetotal);
	$total_role_sale = array_sum($prototal) - $basetotalnum;
	echo '<p class="role-sale">Ваша скидка: ' .$total_role_sale. ' р.</p>';
?>

preg_replace(«/[^0-9]/», », $basetotal); — php функция отбора из переменной только числовых значений

Либо можно сделать более универсально — функцией добавляющей данный расчет в нужные места Woocommerce

function woocommerce_low_cost_total() { 
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 );
		$product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );
			
		if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
			$product_permalink = apply_filters( 'woocommerce_cart_item_permalink', $_product->is_visible() ? $_product->get_permalink( $cart_item ) : '', $cart_item, $cart_item_key );
	
			$is_on_sale = $cart_item[data]->sale_price;
			if ( !empty($is_on_sale) ){
				$proprice = $cart_item[data]->sale_price;
				$proqt = $cart_item['quantity'];
			} else {
				$proprice = $cart_item[data]->regular_price;
				$proqt = $cart_item['quantity'];
			}
			$prototal[] = $proprice * $proqt;
		}
	}
	global $woocommerce;
	$basetotal = $woocommerce->cart->get_cart_total();
	$basetotalnum = preg_replace("/[^0-9]/", '', $basetotal);
	$total_role_sale = array_sum($prototal) - $basetotalnum;
	echo '<p class="role-sale">Ваша скидка: ' .$total_role_sale. ' р.</p>';
}

add_action( 'woocommerce_widget_shopping_cart_before_buttons', 'woocommerce_low_cost_total', 15 ); // в миникорзину
add_action( 'woocommerce_cart_totals_after_order_total', 'woocommerce_low_cost_total', 15 ); // в корзину

И отдельная функция для шаблона оформления:

function woocommerce_low_cost_total_tr() { 
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 );
		$product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );
			
		if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
			$product_permalink = apply_filters( 'woocommerce_cart_item_permalink', $_product->is_visible() ? $_product->get_permalink( $cart_item ) : '', $cart_item, $cart_item_key );
	
			$is_on_sale = $cart_item[data]->sale_price;
			if ( !empty($is_on_sale) ){
				$proprice = $cart_item[data]->sale_price;
				$proqt = $cart_item['quantity'];
			} else {
				$proprice = $cart_item[data]->regular_price;
				$proqt = $cart_item['quantity'];
			}
			$prototal[] = $proprice * $proqt;
		}
	}
	global $woocommerce;
	$basetotal = $woocommerce->cart->get_cart_total();
	$basetotalnum = preg_replace("/[^0-9]/", '', $basetotal);
	$total_role_sale = array_sum($prototal) - $basetotalnum;
	echo '<p class="role-sale">Ваша скидка: ' .$total_role_sale. ' р.</p>';
}
add_action( 'woocommerce_review_order_after_order_total', 'woocommerce_low_cost_total_tr', 15 ); // в шаблон оформления

Тэги: , ,

Поделится информацией с друзьями

  • Похожие записи
  • Комментарии
  • Вложения
Хуки для woocommerce

Хуки для woocommerce

Здесь собраны наиболее востребованные хуки woocommerce, которые могут пригодится при настройке любого интернет-магазина. С другими полезными хуками можно ознакомиться здесь Необходимые части кода вставляем в файл functions (лучше использовать отдельный Читать далее »

/
Иерархия по бренду

Иерархия по бренду

В woocommerce существует иерархия товаров по категории (product_cat), но не всегда этого достаточно. Создадим в woocommerce дополнительную иерархию по бренду. Сортировка по бренду Первым делом создаем атрибут товара Бренд и Читать далее »

Сообщения woocommerce

Сообщения woocommerce

Сообщения woocommerce — система сопроводительной информации при использовании интернет-магазина. В системе есть 3 типа сообщений: информационные (notice), успешные действия (success), ошибки/предупреждения (error) Стандартные сообщения Это перечень стандартных сообщений разделенных по Читать далее »

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

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

Цены в зависимости от группы пользователей
Favicon
Рекомендации для васFaviconOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.