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

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

HIT

14.12.2017

3962

1

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

WC Role Based Price

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

Удобно, то что в настройках плагина можно выбрать определенные роли (например только созданные самостоятельно), которые будут выводится в товаре при активации функции Enable Role Based Pricing. Еще удобно, что группа дополнительных цен сохраняется ajax’ом без перезагрузки и сохранения всей страницы.

Из минусов — неудобная структура хранения цен в одном поле в виде массива. Пример, добавлено дополнительно 3 типа цен (без акционных):

a:3:{s:3:"vip";a:2:{s:13:"regular_price";s:5:"15000";s:13:"selling_price";s:0:"";}s:15:"large_wholesale";a:2:{s:13:"regular_price";s:5:"16500";s:13:"selling_price";s:0:"";}s:9:"wholesale";a:2:{s:13:"regular_price";s:5:"18000";s:13:"selling_price";s:0:"";}}

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

Pro версия за $59 предлагает такие дополнения:

  • Расписание скидки (в стандартном магазине это итак реализовано, но тут предлагается и для скидки для конкретной группы)
  • Динамическая цена (?)
  • Блокировка определенного способа оплаты в зависимости от роли
  • Блокировка оплаты товара в зависимости от роли (?)
  • Таблица со списком ролей и цен
  • Сопряжен с переключением валют (Aelia Currency Switcher Integration)
  • Сопряжен с массовым изменением цен (Bulk Price Updater)
  • Сопряжен с плагином 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 ) );
	}
	
}

Либо еще один способ исправить то что скидка распространяется и на акционные цены (при том что не должна). В том же файле (woocommerce-role-pricing/core/class-woorolepricinglight.php) в условии (строка 80):

if ( $product->get_sale_price() != $product->get_regular_price() && $product->get_sale_price() == $product_get_price ) {
	
	if ( get_option( "wrp-baseprice", "regular" )=="sale" ) {
		$baseprice = $product->get_sale_price();
	}
	
}

добавляем $commission = 1;

Должно получится так:

if ( $product->get_sale_price() != $product->get_regular_price() && $product->get_sale_price() == $product_get_price ) {
	
	if ( get_option( "wrp-baseprice", "regular" )=="sale" ) {
		$baseprice = $product->get_sale_price();
	}
	
	$commission = 1;
	
}

Получить коэфициент скидки текущего пользователя

global $current_user;
$user_roles = $current_user->roles;
$user_role = array_shift($user_roles);
if ( !empty($user_role) ){
	$user_discount_value = get_option( "wrp-" . $user_role );
}

Вывод базовой цены в этом плагине предполагается только в 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 ); // в шаблон оформления

Вывод общих скидок с купонами

Еще одна функция вывода данных в корзине вместе с суммой за купоны

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]->get_sale_price();
			if ( !empty($is_on_sale) ){
				$proprice = $cart_item[data]->get_sale_price();
				$proqt = $cart_item['quantity'];
			} else {
				$proprice = $cart_item[data]->get_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="total-product-price total-product-price-first">Итого за товары без скидок: <strong>' .array_sum($prototal). ' р.</p>';	
	echo '<p class="role-sale">Ваша скидка: ' .$total_role_sale. ' р.</p>';
	echo '<p class="total-product-price total-product-price-last">Итого за товары со скидками: <strong>' .$basetotal. '</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]->get_sale_price();
			
			if ( !empty($is_on_sale) ){
				$proprice = $cart_item[data]->get_sale_price();
				$proqt = $cart_item['quantity'];
			} else {
				$proprice = $cart_item[data]->get_regular_price();
				$proqt = $cart_item['quantity'];
				
				$proprice_regular = $cart_item[data]->get_regular_price();
				$proqt_regular = $cart_item['quantity'];
			}
			
			$prototal[] = $proprice * $proqt;
			
			$prototal_regular[] = $proprice_regular * $proqt_regular;
			
			
		}
	}
	
	$coupons = WC()->cart->get_applied_coupons();
	if (!empty($coupons)) {
		$disc_perc_sum = array();
		foreach( $coupons as $coupon ){
			// Retrieving the coupon ID
			$coupon_post_obj = get_page_by_title($coupon, OBJECT, 'shop_coupon');
			$coupon_id       = $coupon_post_obj->ID;
			// Get an instance of WC_Coupon object in an array(necessary to use WC_Coupon methods)
			$coupon = new WC_Coupon($coupon_id);						
			$disc_perc_sum[] = $coupon->get_amount();
		}
	}
	


	global $woocommerce;
	$basetotal = $woocommerce->cart->get_cart_total();
	$basetotalnum = preg_replace("/[^0-9]/", '', $basetotal);
	$total_role_sale = $basetotalnum - array_sum($prototal_regular);

	$disc_perc = round( array_sum($prototal_regular) * array_sum($disc_perc_sum) / 100 );
	
	
	global $current_user;
    $user_roles = $current_user->roles;
    $user_role = array_shift($user_roles);
	if ( !empty($user_role) ){
		$value_discount_option = get_option( "wrp-" . $user_role );
		$value_discount = round( array_sum($prototal_regular) * $value_discount_option );
	} else {
		$value_discount = 0;
	}
	
	if (!empty($coupons)) { 
		
		$general_discount = array_sum($prototal) - $basetotalnum;
		$skidka_coupons = $general_discount - $value_discount; 
	
	} else { $skidka_coupons = 0; }
	
	
	
	
	echo '<tr><td class="total-product-price total-product-price-first" colspan="2">Итого за товары без скидок: <strong>' .array_sum($prototal). ' р.</strong></td></tr>';
	echo '<tr><td class="total-product-price role-sale" colspan="2">Скидка по промокодам: <strong>' .$skidka_coupons. ' р.</strong></td></tr>';
	echo '<tr><td class="total-product-price role-sale" colspan="2">Скидка пользователя: <strong>' .$value_discount. ' р.</strong></td></tr>';
	echo '<tr><td class="total-product-price total-product-price-last" colspan="2">Итого за товары со скидками: <strong>' .$basetotal. '</strong></td></tr>';	
}
add_action( 'the_woocommerce_show_discount', 'woocommerce_low_cost_total_tr', 15 ); // в оформление

Есть еще два полностью платных плагина по данной тематике — YITH Woocommerce Role Based Prices (60$) и Prices By User Role for WooCommerce (44$), но я их не тестировал.

Удалось попробовать плагин YITH Woocommerce Role Based Prices принцип его работы больше напоминает функционал Woocommerce Role Pricing, но с более гибкими настройками (скидки/наценки в виде процентов или количества к каждому товару или глобально).

Протестировал и плагин Prices By User Role for WooCommerce. Данный плагин дает возможность различных манипуляций с ценой и товаром в зависимости от роли: скрытие цены, скрытие товаров, скидка (% или руб) для групп. Но индивидульную цену на каждый товар этот плагин не поддерживает.

Price based on User Role for WooCommerce

Нашел еще один плагин, менее популярный чем предыдущие (700+), но дающий неплохой функционал по установке цен на каждый товар в зависимости от роли — Price based on User Role for WooCommerce. И при соответствующей доработке, этим плагином можно решать некоторые задачи. Выгодным отличием от WC Role Based Price (по крайней мере его бесплатной версии, платную не использовал) является структура хранения цен в метаполях. В этом смысле даже у плагина считаю перебор, т.к. он для каждой роли создает аж по три метаполя.

Перечислю тезисно что входит в функционал плагина:

  • Массовые правила для групп. Реализовано в виде коэффициента.
  • Цена в зависимости от роли для каждого товара.
  • Выбор набора ролей, которые будут выводится в товаре для назначения цен.
  • Скрыть цены либо глобально для роли, либо индивидуально для любого товара в зависимости от роли.
  • Поля доступны для массового редактирования в Advanced Bulk Edit.
  • Поля доступны для экспорта / импорта.
  • Поддержка вариаций.

И теперь о плохом, в бесплатной версии плагина допускается создание всего одного товара с ценами для ролей, видимо только для тестирования. Pro версия стоит 20$ (10.01.2019).

Тэги: , ,

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

  • Похожие записи
  • Комментарии
  • Вложения
Отключаем лишний функционал Woocommerce

Отключаем лишний функционал Woocommerce

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

Бонусная система

Бонусная система

Система лояльности покупателей — один из сильнейших маркетинговых инструментов. Рассмотрим бонусная систему как один из вариантов реализации системы лояльности. Будем начислять за покупки (либо любые другие действия) балы, которыми покупатель Читать далее »

Плагины для woocommerce (нюансы)

Плагины для woocommerce (нюансы)

Рассмотрим различные плагины дополняющие функционал woocommerce, а также различные нюансы их использования. YITH WooCommerce Wishlist Плагин для добавление в ИМ раздела Избранное. В который можно/нужно помещать товары которые могут понадобится Читать далее »

/

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

1 комментарий

  1. Аватар
    Сергей

    Хорошая работа, при использовании вашего кода :
    // Вывести базовую цену
    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 );

    При singl продукте все работает, при вариативном товаре , при условии что у каждой вариации своя цена этот код не работает. получается вот так
    Warning: A non-numeric value encountered in ….вот на эту строку ругается: $skidka = $product->get_regular_price() — $product->get_price();Дело в том что так как разная цена, то пишется  цена от 100-300, и поэтому наверное не получается правильно посчитать. Как изменить формулу чтоб вчитывалось из цены конкретно выбранной вариации. 

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