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

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

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

Диагностика проблемы: почему стандартные скидки не всегда подходят

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

  • Скидка только для зарегистрированных пользователей с ролью «оптовик»
  • Изменение цены в зависимости от количества товаров в корзине
  • Автоматическое повышение цены на определённые товары в праздничные дни

Если попытаться сделать это через купоны — получится неудобно и неавтоматично. Потребуется программное вмешательство.

Пошаговое решение: как программно изменять цены с помощью хуков WooCommerce

Используем хук woocommerce_get_price

Этот фильтр позволяет изменить цену товара на лету. Его можно использовать для любых сценариев.

add_filter('woocommerce_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
    // Пример: скидка 10% для пользователей с ролью оптовик
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        if (in_array('wholesaler', (array) $user->roles)) {
            $price = $price * 0.9; // скидка 10%
        }
    }
    return $price;
}

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

Иногда нужно изменять цену товара, если в корзине больше определённого количества товара. Для этого дополнительно получаем данные о корзине.

add_filter('woocommerce_get_price', 'custom_price_based_on_cart_quantity', 10, 2);
function custom_price_based_on_cart_quantity($price, $product) {
    if (is_admin()) return $price; // не меняем цену в админке

    $target_product_id = 123; // ID товара для изменения цены
    $threshold = 5; // минимальное количество для скидки

    $cart_quantity = 0;
    foreach (WC()->cart->get_cart() as $cart_item) {
        if ($cart_item['product_id'] == $target_product_id) {
            $cart_quantity += $cart_item['quantity'];
        }
    }

    if ($product->get_id() == $target_product_id && $cart_quantity >= $threshold) {
        $price = $price * 0.85; // скидка 15%
    }
    return $price;
}

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

Для проверки изменений цены:

  • Очистите кэш сайта и браузера (особенно если используете кеширующие плагины)
  • Авторизуйтесь под пользователем с нужной ролью (если условие на роль)
  • Добавьте в корзину товар, на который влияет изменение цены
  • Убедитесь, что на странице товара и в корзине отображается изменённая цена
  • Проверьте, что в админке цена товара осталась без изменений (изменения только на фронтенде)

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

  • Цена не меняется на странице товара или в корзине: проверьте, что хук woocommerce_get_price действительно срабатывает, и что код подключён правильно в functions.php или в плагине. Также убедитесь, что нет конфликтов с другими плагинами, которые могут перезаписывать цену.
  • Изменения цены влияют на админку: всегда добавляйте проверку is_admin() и возвращайте оригинальную цену в админке, иначе могут возникнуть проблемы с учётом и отчетностью.
  • Ошибка при обращении к корзине на странице товара: WC()->cart доступна только после инициализации WooCommerce и только на фронтенде, поэтому используйте проверку if (WC()->cart) и не вызывайте код в админке.
  • Изменённая цена не учитывается в заказах: при использовании фильтра woocommerce_get_price убедитесь, что WooCommerce пересчитывает стоимость в корзине и при оформлении заказа. Иногда потребуется дополнительно фильтровать woocommerce_product_get_price и woocommerce_product_variation_get_price.

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

  • Не используйте тяжелые запросы к базе в функциях изменения цены, чтобы не замедлять загрузку страниц.
  • Всегда кешируйте результаты вычислений внутри функции, если условия сложные.
  • Проверяйте права пользователя через стандартные функции WordPress, не пишите собственные обходы.
  • Тестируйте код на тестовой среде перед выкатыванием на продакшн.

Сравнение подходов: плагин vs кастомный код

ПодходПлюсыМинусыРекомендации
Плагины для динамических цен
(например, WooCommerce Dynamic Pricing)
Готовые интерфейсы, простая настройка без кодаМогут быть тяжеловесными, ограничены в кастомизации, платныеИспользовать при простых задачах и отсутствии навыков программирования
Кастомный код (хуки WooCommerce)Максимальная гибкость, лёгкий и быстрый код, полностью под себяТребует знаний PHP и WooCommerce API, возможны ошибкиРекомендуется для разработчиков и при нестандартных сценариях
Автоматическое удаление старых записей в WordPress по дате публикации
03.02.2026
Как добавить автоматическое удаление неактивных пользователей в WordPress
14.02.2026
Автоматическое удаление старых комментариев в WordPress: практическое решение
13.12.2025
Как добавить автоматическое удаление старого контента в WordPress
01.04.2026
WooCommerce: автоматическое изменение стоимости товаров при определённых условиях
09.05.2026