Автоматическое изменение цены товара в WooCommerce при заданных условиях

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

В WooCommerce часто требуется менять цену товара в зависимости от условий, например, при покупке определённого количества, для определённой категории пользователей или при действии промокода. Стандартные функции WooCommerce не всегда позволяют гибко настраивать такие изменения без написания кода или использования плагинов.

Основные вопросы, которые решает статья:

  • Как программно изменить цену товара на лету при добавлении в корзину;
  • Как задать условия изменения цены (по роли пользователя, по сумме заказа, по количеству товаров);
  • Как проверить и отладить работу кода;
  • Как избежать распространённых ошибок при изменении цены.

Как программно изменить цену товара в WooCommerce

Использование фильтра woocommerce_get_price

Самый простой способ — использовать фильтр woocommerce_get_price, который возвращает цену товара при запросе. Ниже пример, который снижает цену на 20% для пользователей с ролью "оптовик".

add_filter('woocommerce_get_price', 'custom_discount_for_wholesale', 10, 2);
function custom_discount_for_wholesale($price, $product) {
    if (current_user_can('wholesale_customer')) {
        $price = $price * 0.8; // скидка 20%
    }
    return $price;
}

Этот код меняет цену везде, где вызывается метод get_price(), включая страницу товара и корзину. Но он не меняет цену в базе, только при выводе.

Изменение цены при добавлении товара в корзину

Если нужно менять цену в корзине, лучше использовать фильтр woocommerce_before_calculate_totals. Он позволяет задать цену для каждого товара в корзине перед расчётом итогов.

add_action('woocommerce_before_calculate_totals', 'custom_price_in_cart', 20, 1);
function custom_price_in_cart($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    if (empty($cart->get_cart())) return;

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        // Пример: скидка 10% если в корзине больше 3 штук товара
        if ($cart_item['quantity'] > 3) {
            $new_price = $product->get_regular_price() * 0.9;
            $product->set_price($new_price);
        }
    }
}

Обратите внимание, что здесь мы меняем цену прям в объекте продукта в корзине, это влияет только на текущий заказ.

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

  1. Определите условие, при котором меняется цена. Например, роль пользователя и количество в корзине.
  2. Добавьте следующий код в functions.php вашей темы или в плагин-сниппет:
add_action('woocommerce_before_calculate_totals', 'set_custom_price_for_role_and_qty', 20, 1);
function set_custom_price_for_role_and_qty($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    if (empty($cart->get_cart())) return;

    if (!current_user_can('premium_customer')) return; // только для роли

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if ($cart_item['quantity'] >= 5) {
            $discount_price = $product->get_regular_price() * 0.85; // скидка 15%
            $product->set_price($discount_price);
        }
    }
}
  1. Сохраните изменения и очистите кеш WooCommerce (если используете кеширование).
  2. Добавьте в корзину более 5 товаров под пользователем с ролью premium_customer.
  3. Проверьте, что цена изменилась на 15% скидку.

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

  • Войдите под пользователем, который соответствует условию (например, роль premium_customer).
  • Добавьте в корзину товар в количестве, которое активирует скидку (5 и более).
  • На странице корзины проверьте цену товара — она должна быть меньше на 15% по сравнению с обычной.
  • Можно временно добавить error_log() в функцию для отладки, например: error_log('Цена изменена на: '.$new_price);.

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

  • Цена не меняется в корзине: часто из-за того, что код добавлен с ошибками или фильтр/хук подключён неправильно. Проверьте правильность подключения и хук woocommerce_before_calculate_totals.
  • Изменяется цена для всех пользователей: забыли проверить роль пользователя. Используйте current_user_can() или аналогичные проверки.
  • Цена меняется на странице товара, но не в корзине: фильтр woocommerce_get_price влияет на цену товара, но корзина берёт цену из объекта продукта, который нужно менять через set_price().
  • Кеширование мешает видеть изменения: очистите кеш плагинов кеширования, а также кеш браузера.
  • Изменение цены влияет на другие места сайта: ограничьте область применения функции проверками условий и ролей.

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

  • Не меняйте цены в базе данных напрямую — используйте хуки и методы API WooCommerce.
  • Добавляйте проверки is_admin и DOING_AJAX, чтобы избежать лишних изменений при админских запросах.
  • Минимизируйте сложные вычисления внутри циклов корзины, чтобы не замедлять загрузку страницы.
  • Для сложных условий рассмотрите использование метаданных товаров и пользователей для хранения параметров скидок.
  • Если нужна масштабируемость — используйте плагины кеширования цен или коммерческие расширения WooCommerce.

Сравнение способов изменения цены: фильтр vs изменение в корзине

МетодГде действуетПреимуществаОграничения
woocommerce_get_priceВезде при вызове цены товараПросто, универсальноНе меняет цену в корзине, может влиять на сайт целиком
woocommerce_before_calculate_totalsТолько в корзине и оформлении заказаТочно меняет цену в корзине, не трогая базуНе меняет цену на странице товара
Автоматическое удаление неактивных заказов в WooCommerce
22.05.2026
Как создать массивный импорт курсов в WordPress с помощью AJAX и REST API
25.01.2026
Автоматическое создание категорий для курсов в WordPress
01.03.2026
Как защитить WordPress от bruteforce-атак с помощью плагинов и кода
22.02.2026
Как создать автоматический импорт курсов в WordPress для образовательного сайта
04.01.2026