WooCommerce: автоматическое изменение стоимости товара при выполнении условий

Диагностика задачи: когда нужно менять цену товара автоматически

Зачастую в WooCommerce требуется динамически менять цену товара на этапе добавления в корзину в зависимости от определённых условий: пользовательская роль, количество товара, наличие купонов, дата и время, геолокация и т. д. Это полезно для гибкого ценообразования без создания отдельных вариаций или скидок.

Основная проблема — стандартный функционал WooCommerce не предусматривает простое изменение цены товара в корзине через админку. Для реализации необходимо вмешательство в процесс добавления товара и корректировка цены с помощью фильтров и действий.

Как отследить момент изменения цены товара

Для динамического изменения цены в WooCommerce используется фильтр 'woocommerce_before_calculate_totals'. Он срабатывает при подсчёте стоимости корзины. В обработчике можно перебрать все товары корзины и изменить цену через метод set_price() объекта WC_Cart_Item.

Пример кода изменения цены по пользовательской роли

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_based_on_role', 10, 1);
function custom_dynamic_price_based_on_role($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    // Получаем текущего пользователя
    $user = wp_get_current_user();

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        // Пример: если у пользователя роль 'wholesale_customer'
        if (in_array('wholesale_customer', (array) $user->roles)) {
            // Устанавливаем новую цену (например, 20% скидка)
            $regular_price = $product->get_regular_price();
            $new_price = $regular_price * 0.8;
            $product->set_price($new_price);
        }
    }
}

Пошаговое решение: автоматическое изменение цены по количеству товара

Рассмотрим кейс, когда цена товара меняется в зависимости от количества в корзине (оптовая скидка).

  1. Подключаемся к фильтру woocommerce_before_calculate_totals.
  2. Перебираем все товары корзины.
  3. Проверяем количество каждого товара.
  4. Если количество превышает заданный порог, меняем цену.
add_action('woocommerce_before_calculate_totals', 'dynamic_price_by_quantity', 10, 1);
function dynamic_price_by_quantity($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    foreach ($cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        $quantity = $cart_item['quantity'];
        $regular_price = $product->get_regular_price();

        // Если куплено 5 и более, применяем скидку 15%
        if ($quantity >= 5) {
            $discounted_price = $regular_price * 0.85;
            $product->set_price($discounted_price);
        } else {
            // Восстанавливаем цену, если количество меньше порога
            $product->set_price($regular_price);
        }
    }
}

Как проверить, что изменение цены сработало

  • Добавьте товар в корзину с количеством, подходящим под условие.
  • Перейдите в корзину и убедитесь, что цена изменилась согласно логике.
  • Проверьте страницу оформления заказа — цена должна сохраняться.
  • Если используется кэширование, очистите кэш перед тестом.

Частые ошибки при динамическом изменении цены и как их исправить

  • Изменение цены в админке или на фронтенде неконсистентно: фильтр должен игнорировать админский интерфейс и AJAX-запросы, иначе цена изменится в неподходящих местах. Используйте проверку is_admin() && !defined('DOING_AJAX').
  • Цена не меняется при повторном пересчёте корзины: убедитесь, что изменения цены происходят в woocommerce_before_calculate_totals и не кешируются.
  • Цена сбрасывается после обновления страницы: возможно, другие хуки или плагины конфликтуют с вашим кодом. Для диагностики временно отключите плагины, влияющие на ценообразование.
  • Цена изменилась для всех пользователей, хотя условие ориентировано на роль: проверьте правильность проверки ролей и получение текущего пользователя.

Практические советы по безопасности и производительности

  • Не храните изменённые цены в базе данных — меняйте цену динамически в корзине, чтобы избежать рассинхронизации.
  • Избегайте тяжёлых запросов внутри фильтра, так как он вызывается часто.
  • Для сложных условий (геолокация, дата) кэшируйте результаты вычислений с помощью трансзиентов.
  • Тестируйте на тестовом сайте, чтобы избежать сбоев в магазине.
  • Используйте дочернюю тему или отдельный плагин для хранения кастомного кода, чтобы не потерять изменения при обновлениях.

Сравнение методов реализации изменения цены в WooCommerce

Метод Плюсы Минусы
Использование 'woocommerce_before_calculate_totals' и set_price() Гибкость, не требует сторонних плагинов, работает на лету Требует знаний PHP, возможны конфликты с другими плагинами
Плагины для динамического ценообразования (например, WooCommerce Dynamic Pricing) Простота настройки через админку, готовые условия Стоимость, нагрузка на сайт, ограниченная кастомизация
Создание вариаций с разными ценами Простота для конечного пользователя, встроено в WooCommerce Увеличение количества товаров, неудобно при множестве условий
Как добавить уникальное поле в форму регистрации WordPress
16.02.2026
Как автоматизировать удаление старого кеша в WordPress
27.01.2026
Как добавить динамические атрибуты в shortcode WordPress
01.03.2026
WooCommerce: автоматическое изменение стоимости товара при добавлении в корзину по условиям
20.05.2026
Как удалить ревизии записей в WordPress с помощью плагинов и кода
13.02.2026