Диагностика задачи: зачем менять цену товара при регистрации
Задача изменить стоимость товара для новых пользователей WooCommerce часто возникает при запуске акций, программ лояльности или для сегментирования покупателей. Важно понять, что цена должна динамически адаптироваться в зависимости от статуса пользователя: гость, зарегистрированный пользователь, новый клиент и т.д.
Обычные методы изменения цены через админку WooCommerce не подходят, если цена должна меняться автоматически после регистрации пользователя и применяться только к нему.
Как реализовать изменение цены товара для новых зарегистрированных пользователей
Шаг 1. Определить новых пользователей
В WooCommerce у каждого пользователя есть дата регистрации, доступная через user_registered. Чтобы считать пользователя новым, можно задать период, например, 7 дней с момента регистрации.
function is_new_user( $user_id ) {
$user = get_userdata( $user_id );
if ( ! $user ) {
return false;
}
$registered_date = strtotime( $user->user_registered );
$days_limit = 7; // период, в течение которого действует скидка
return ( time() - $registered_date ) <= ( $days_limit * DAY_IN_SECONDS );
}Шаг 2. Изменить стоимость товара на лету
Используем фильтр WooCommerce woocommerce_product_get_price и woocommerce_product_get_regular_price, чтобы динамически менять цену на фронтенде и в корзине.
add_filter( 'woocommerce_product_get_price', 'change_price_for_new_users', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'change_price_for_new_users', 10, 2 );
function change_price_for_new_users( $price, $product ) {
if ( is_user_logged_in() ) {
$user_id = get_current_user_id();
if ( is_new_user( $user_id ) ) {
// Пример: скидка 15% для новых пользователей
$discount = 0.15;
$new_price = $price * ( 1 - $discount );
return round( $new_price, wc_get_price_decimals() );
}
}
return $price;
}Шаг 3. Обновить цену в корзине и на этапе оформления заказа
Для корректного отображения цены и итогов необходимо применить фильтр woocommerce_before_calculate_totals к объектам корзины:
add_action( 'woocommerce_before_calculate_totals', 'apply_discount_to_cart_items', 10, 1 );
function apply_discount_to_cart_items( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
if ( ! is_user_logged_in() ) return;
$user_id = get_current_user_id();
if ( ! is_new_user( $user_id ) ) return;
$discount = 0.15;
foreach ( $cart->get_cart() as $cart_item ) {
$original_price = $cart_item['data']->get_price();
$new_price = $original_price * ( 1 - $discount );
$cart_item['data']->set_price( round( $new_price, wc_get_price_decimals() ) );
}
}Проверка результата после внедрения
- Зарегистрируйте нового пользователя на сайте.
- Авторизуйтесь под этим пользователем.
- Перейдите на страницу товара и убедитесь, что цена ниже на 15%.
- Добавьте товар в корзину и проверьте итоговую цену в корзине и на странице оформления заказа.
- Выйдите из аккаунта или войдите под пользователем старше 7 дней, чтобы убедиться, что скидка не применяется.
Частые ошибки и как их исправить
- Скидка не отображается в корзине: убедитесь, что функция
apply_discount_to_cart_itemsподключена к хукуwoocommerce_before_calculate_totalsи что в ней используется правильная логика проверки пользователя. - Цена меняется для всех пользователей: проверьте условие в функции, чтобы скидка применялась только новым зарегистрированным пользователям.
- Ошибка округления цен: используйте функцию
roundс параметромwc_get_price_decimals()для корректного отображения стоимости. - Кэширование мешает обновлению цены: очистите кэш сайта и браузера, отключите плагины кэширования на время тестирования.
Практические советы по безопасности и производительности
- Не храните скидку и дату регистрации в сессии или куках — используйте данные из базы через функции WordPress и WooCommerce для точности.
- Для снижения нагрузки кешируйте результат функции
is_new_userна время запроса, например, черезwp_cache_getиwp_cache_set. - Тестируйте изменения на staging-сайте, чтобы не повлиять на работу магазина в продакшене.
- При необходимости расширения логики скидок рассмотрите внедрение кастомных ролей или метаполей пользователей.
Сравнение вариантов реализации изменения цены
| Метод | Плюсы | Минусы |
|---|---|---|
| Фильтры WooCommerce (как в статье) | Гибкость, работает для всех товаров, не требует сторонних плагинов | Нужно писать код, возможны ошибки при сложных условиях |
| Плагины скидок и правил (например, WooCommerce Dynamic Pricing) | Удобный интерфейс, много готовых условий | Платные, могут влиять на производительность |
| Кастомные роли и цены | Четкое разграничение пользователей, стабильность | Нужно дополнительное управление ролями, сложно для новых пользователей |