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

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

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

Часто владельцы сталкиваются с тем, что попытки изменить цену не работают — причина в том, что цена товара в WooCommerce берётся из объекта продукта, и простое изменение $_POST или JavaScript не срабатывает на сервере.

Пошаговое решение: изменение цены товара в корзине через хук woocommerce_before_calculate_totals

Правильный способ — использовать фильтр, который срабатывает перед подсчётом итоговой стоимости корзины. Ниже пример, как изменить цену продукта в корзине, если пользователь — подписчик, и добавлено больше 3 единиц товара.

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_change', 20, 1);
function custom_dynamic_price_change( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;

    // Проверяем роль пользователя
    if ( ! is_user_logged_in() ) return;
    $user = wp_get_current_user();
    if ( ! in_array( 'subscriber', (array) $user->roles ) ) return;

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

Этот код нужно добавить в файл functions.php вашей дочерней темы или в плагин для кастомных функций.

Как адаптировать под другие условия

  • Замените проверку роли пользователя на другую, например, administrator или кастомную роль.
  • Меняйте цену в зависимости от ID товара, проверяя $cart_item['product_id'].
  • Добавляйте дополнительные условия, например, проверку текущей даты или наличия промокода.

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

Чтобы проверить работоспособность:

  1. Авторизуйтесь под пользователем с ролью subscriber или нужной ролью.
  2. Добавьте в корзину более 3 единиц одного и того же товара.
  3. Перейдите в корзину, проверьте цену товара — должна быть уменьшена на 10% от базовой цены.
  4. Попробуйте добавить меньше 4 единиц — цена не изменится.
  5. Авторизуйтесь под пользователем без нужной роли — цена не должна меняться.

Для отладки можно временно добавить error_log в функцию, например:

error_log('Цена изменена для товара ID '.$cart_item['product_id']);

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

  • Изменение цены не работает: вероятно, код не подключен или происходит раньше, чем рассчитывается корзина. Убедитесь, что хук woocommerce_before_calculate_totals используется с приоритетом 20 или выше.
  • Цена меняется для всех пользователей: проверьте условие на роль пользователя, возможно, пользователь не авторизован или роль указана неверно.
  • Изменённая цена сбрасывается после обновления страницы: убедитесь, что код работает при каждом пересчёте корзины, не сохраняйте цену в базе.
  • Конфликты с плагинами кеширования: кеширование страниц может мешать динамическим изменениям цен. Используйте исключения для страниц корзины и оформления заказа.

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

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

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

МетодПлюсыМинусыПример
Хук woocommerce_before_calculate_totalsГибкость, точечное изменение цены в корзинеТребует навыков PHP, не работает вне корзиныПример из статьи
Плагины скидок (например, WooCommerce Dynamic Pricing)Простота настройки, готовые правилаМожет быть дорого, ограничена кастомизацияОфициальный плагин
JavaScript на фронтендеБыстрое изменение отображения ценыНе влияет на итоговую стоимость на сервереНедопустимо для изменения цены
Как установить ограничения на регистрацию в WordPress по домену и email
10.02.2026
Как создать автоматические обновления контента в WordPress с помощью WP-Cron
26.03.2026
Оптимизация загрузки шаблонов в WordPress для ускорения сайта
15.12.2025
Как использовать REST API WordPress для создания кастомных приложений
13.11.2025
Как автоматизировать удаление старых пустых категорий в WordPress
23.03.2026