Проблема: необходимость изменять цену товара после регистрации пользователя
В WooCommerce иногда требуется менять стоимость товаров для новых пользователей сразу после их регистрации. Например, можно установить специальные цены для новичков или предложить скидку на первый заказ. Стандартными средствами WooCommerce это не реализуется, поэтому нужно писать кастомный код с использованием хуков.
Диагностика задачи: что нужно учесть
- Регистрация пользователя может быть стандартной или через сторонний плагин — важно знать, какой хук срабатывает после успешной регистрации.
- Изменение цены должно применяться только новым зарегистрированным пользователям, а не всем подряд.
- Цена товара может меняться для корзины и отображаться на страницах — нужно правильно применить фильтры WooCommerce.
- Важно не затронуть базовые цены в базе, чтобы не испортить данные.
Пошаговое решение: автоматическое изменение стоимости товара для новых пользователей
1. Отслеживаем регистрацию пользователя
Используем хук user_register, который срабатывает сразу после создания нового пользователя.
add_action('user_register', 'wc_apply_new_user_discount');
function wc_apply_new_user_discount($user_id) {
// Сохраняем мета, что пользователь новый
update_user_meta($user_id, '_is_new_customer', 'yes');
}2. Изменяем цену товаров для новых пользователей в корзине и на фронтенде
Для изменения цены применим фильтры woocommerce_get_price и woocommerce_cart_item_price. Но проще использовать woocommerce_product_get_price и woocommerce_product_get_regular_price, чтобы менять цену везде.
add_filter('woocommerce_product_get_price', 'wc_change_price_for_new_user', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'wc_change_price_for_new_user', 10, 2);
function wc_change_price_for_new_user($price, $product) {
if (is_user_logged_in()) {
$user_id = get_current_user_id();
$is_new = get_user_meta($user_id, '_is_new_customer', true);
if ($is_new === 'yes') {
// Устанавливаем скидку 20% для новых пользователей
$price = $price * 0.8;
}
}
return $price;
}3. Снимаем отметку о новом пользователе после первого заказа
Чтобы не применять скидку постоянно, удалим мета после первого заказа пользователя.
add_action('woocommerce_thankyou', 'wc_remove_new_user_flag_after_order');
function wc_remove_new_user_flag_after_order($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
$user_id = $order->get_user_id();
if ($user_id) {
delete_user_meta($user_id, '_is_new_customer');
}
}Проверка результата после внедрения
- Зарегистрируйте нового пользователя через форму регистрации.
- Зайдите под этим пользователем на сайт.
- Откройте страницу товара и убедитесь, что цена уменьшена на 20%.
- Добавьте товар в корзину — цена в корзине должна совпадать с изменённой.
- Оформите заказ.
- После оформления заказа снова проверьте цену — она должна вернуться к стандартной, без скидки.
Частые ошибки и как их исправить
- Отсутствует скидка для новых пользователей: Проверьте, что мета
_is_new_customerустановлена после регистрации. Возможно, регистрация происходит не через стандартный хукuser_register. Используйте дебаг или логи. - Цена не меняется на страницах товаров: Убедитесь, что фильтры
woocommerce_product_get_priceиwoocommerce_product_get_regular_priceприменяются корректно. Иногда темы/кеширование могут мешать. Очистите кеш. - Скидка остается после первого заказа: Проверьте, что хук
woocommerce_thankyouсрабатывает и мета удаляется. Можно добавить логи. - Проблемы с кэшированием на сервере: Если используете кеш (например, Redis, Varnish), убедитесь, что страницы для залогиненных пользователей не кешируются.
Практические советы по безопасности и производительности
- Для хранения данных используйте
update_user_meta, а не собственные таблицы. - Избегайте изменения цен в базе — только динамическое переопределение через фильтры.
- Добавьте проверку
is_admin()в фильтры, чтобы не ломать админ-панель WooCommerce. - Минимизируйте вычисления внутри фильтров, кешируйте результаты, если цены сложные.
Сравнение подходов к изменению цены при регистрации
| Метод | Плюсы | Минусы |
|---|---|---|
| Кастомный код с хуками (как в статье) | Полный контроль, нет зависимостей, легко настраивается | Требует навыков PHP, возможны баги при неправильной реализации |
| Плагины скидок/цен (например, WooCommerce Dynamic Pricing) | Готовые решения, удобный интерфейс | Платные, могут быть избыточны для простой задачи |
| Изменение базы данных напрямую | Постоянное изменение цены | Риск нарушения целостности данных, не рекомендуется |