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

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

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

Типичные сценарии:

  • Скидка при покупке от 3 штук одного товара;
  • Изменение цены для определённых групп пользователей (например, оптовиков);
  • Временные цены для акций без изменения основной цены в админке;
  • Зависимость цены от выбранных атрибутов или других параметров.

Пошаговое решение: как реализовать изменение цены в коде

Для изменения цены товара перед выводом и добавлением в корзину удобно использовать фильтр woocommerce_get_price или woocommerce_product_get_price. Рассмотрим пример, где цена меняется при покупке более 3 единиц товара.

1. Изменение цены при количестве товара в корзине

Добавьте следующий код в файл functions.php вашей темы или в свой плагин:

add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2);

function custom_dynamic_price($price, $product) {
    if (is_admin()) return $price; // не менять в админке

    $cart = WC()->cart;
    if (!$cart) return $price; // если корзина не инициализирована

    $cart_item_key = null;
    foreach ($cart->get_cart() as $key => $item) {
        if ($item['product_id'] == $product->get_id()) {
            $cart_item_key = $key;
            break;
        }
    }

    if (!$cart_item_key) return $price; // товара нет в корзине

    $quantity = $cart->get_cart_item_quantity($cart_item_key);

    if ($quantity >= 3) {
        // например, скидка 20%
        $price = $price * 0.8;
    }

    return $price;
}

Этот код проверяет, сколько данного товара уже в корзине, и если 3 и более — снижает цену на 20%.

2. Изменение цены для определённых ролей пользователей

Для оптовиков с ролью wholesale_customer можно добавить скидку 15%:

add_filter('woocommerce_product_get_price', 'price_for_wholesale_users', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'price_for_wholesale_users', 10, 2);

function price_for_wholesale_users($price, $product) {
    if (is_admin()) return $price;
    if (!is_user_logged_in()) return $price;

    $user = wp_get_current_user();
    if (in_array('wholesale_customer', (array) $user->roles)) {
        $price = $price * 0.85; // скидка 15%
    }

    return $price;
}

Проверка результата после внедрения

  • Добавьте в корзину 3 и более единиц товара и обновите страницу корзины. Цена должна измениться с учётом скидки.
  • Залогиньтесь под пользователем с ролью wholesale_customer и проверьте цену на странице товара и в корзине.
  • Если скидка не применится, проверьте, что код корректно подключён и фильтры срабатывают (можно добавить error_log() для отладки).

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

  • Цена не меняется в админке: так и должно быть, фильтры игнорируют админку с помощью is_admin().
  • Цена не меняется при добавлении товара в корзину: возможно, корзина не инициализирована, код срабатывает слишком рано. Убедитесь, что код подключён в правильном хуке или в functions.php.
  • Конфликт с другими плагинами скидок: проверьте порядок применения фильтров и совместимость.
  • Некорректное округление цены: используйте функции WooCommerce wc_price() и wc_format_decimal() для правильного форматирования.

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

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

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

МетодПлюсыМинусыРекомендации
Код на хуках (как в статье)Гибко, бесплатно, без лишних плагиновТребует навыков, возможны конфликтыИспользуйте для простых условий
Плагины скидок (Dynamic Pricing, Discount Rules)Простой интерфейс, много условийПлатные, влияет на скоростьДля сложных сценариев и непрофильных пользователей
Кэширование и сторонние сервисыВысокая производительностьСложность настройки, дополнительные расходыДля крупных магазинов с большим трафиком
Автоматическая замена контента в WordPress: практическое решение с использованием WPRemark
15.04.2026
WooCommerce: как автоматически изменять стоимость товара при определённых условиях
26.05.2026
Как добавить AJAX фильтрацию товаров в WordPress для малого бизнеса
14.03.2026
Как создать собственный shortcode в WordPress с примером кода
03.12.2025
Как удалить порты в WordPress для блокировки внешних запросов
30.03.2026