Опишу механику скидки за первый заказ. Скидку можно давать только зарегистрированным пользователям, либо также и не зарегистрированным.
С зарегистрированными понятно. Благодаря плагину WooCommerce Extended Coupon Features FREE (30 000) ставим роль Customer и лимит на одного пользователя. Минусом данного способа является то что пользователю нужно сначала зарегистрироваться или авторизоваться.
Для того чтобы купон срабатывал автоматически, без введения, в настройках плагина WooCommerce Extended Coupon Features FREE (Miscellaneous) нужно включить Auto coupon.
Скидка для незарегистрированного пользователя
Разрешаем регистрацию и авторизацию при оформлении заказа:

Делаем регистрацию принудительной:
jQuery('#createaccount').attr('checked',true);
И скрываем чекбокс «Хотите зарегистрироваться?»:
.woocommerce-account-fields {display: none;}
После оформления заказа пользователю на указанный e-mail помимо заказа придет письмо о регистрации на сайте (с автоматическими логином и паролем). Если пользователь выйдет из учетки и захочет еще раз совершить заказ, то при вводе той же почты ему выведется уведомление «Пользователь с таким e-mail уже существует», а т.к. тут же в Оформлении выведена форма для авторизации, пользователь должен либо ввести новую почту, либо авторизоваться.
Конечно пользователь может ввести фейковую почту. Но в этом случае он не получит на нее заказ.
Также пользователь может использовать свои несколько почтовых ящиков, но это он может сделать и при скидке только для зарегистрированных пользователей (для создания нескольких учеток).
Всплывающее окно «Скидка за первый заказ»
Для того чтобы определить первый ли заказ у пользователя делаем функцию:
function get_user_orders_total($user_id) {
// Use other args to filter more
$args = array(
'customer_id' => $user_id,
'posts_per_page' => -1
);
// call WC API
$orders = wc_get_orders($args);
if (empty($orders) || !is_array($orders)) {
return false;
}
// Количество заказов
if ($user_id == 0) {
$total = 0;
} else {
$total = count($orders);
}
// Сумма всех заказов
/*$total = array_reduce($orders, function ($carry, $order) {
$carry += (float)$order->get_total();
return $carry;
}, 0.0);*/
return $total;
}
Далее с помощью этой функции создаем условие:
$cur_user_id = get_current_user_id();
if ( !get_user_orders_total($cur_user_id) >= 1 ) {
//Выводим функционал всплывающего окна
}
Если есть или планируется подключение к Яндекс Маркету скрипт вывода окна также нужно подредактировать, чтобы не выводить окно в шаблонах карточки товара, корзине и в оформлении. ЯМ этого не любит и выдаст претензию к качеству.
jQuery(document).ready(function() {
if(!location.href.match(/cart/) && !location.href.match(/product\//) && !location.href.match(/checkout/)) {
//скрипт вывода всплывающего окна
}
});
Скидка для зарегистрированных пользователей (всегда), но кроме позиций у которых количество более 2 шт
Данная механика нужна если на сайте действует глобально система скидок от количества позиций (от 3 шт — 10% скидка на эту позицию), а скидку (10%) нужно дать зарегистрированным пользователям только на позиции которых менее 3 шт.
// Акция 10% зарегистрированным пользователям (кроме позиций которых более 2 шт)
add_action( 'woocommerce_cart_calculate_fees','wc_custom_surcharge', 10, 1 );
function wc_custom_surcharge( $cart ) {
if ( is_user_logged_in() ) {
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 ( $cart_item['quantity'] < 3 ) {
$all_prices[] = $_product->get_price() * $cart_item['quantity'];
}
}
if ( isset($all_prices) ) {
$fee_descript = 'Скидка 10% зарегистрированным пользователям';
$fee = round(array_sum($all_prices), 2) * 0.1;
$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() {
if ( is_user_logged_in() ) {
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 ( $cart_item['quantity'] < 3 ) {
$all_prices[] = $_product->get_price() * $cart_item['quantity'];
}
}
if ( isset($all_prices) ) {
$symbol = get_woocommerce_currency_symbol('RUB');
$skidka = round(array_sum($all_prices), 2) * 0.1;
echo '<p>Скидка 10% зарегистрированным пользователям: <strong><bdi>'.$skidka.' '.$symbol.'</bdi></strong></p>';
}
}
}
[site-socialshare]