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

Диагностика задачи: зачем автоматизировать изменение цены в WooCommerce

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

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

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

Для динамического изменения стоимости товара в корзине используется фильтр woocommerce_before_calculate_totals. В примере ниже мы уменьшим цену на 10% для товаров из определённой категории «sale».

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

    // Предотвращаем повторное применение
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        if ( has_term( 'sale', 'product_cat', $product->get_id() ) ) {
            $original_price = $product->get_regular_price();
            $discounted_price = $original_price * 0.9; // скидка 10%
            $product->set_price( $discounted_price );
        }
    }
}

Этот код проверяет каждый товар в корзине, если он в категории «sale», уменьшает цену на 10%.

Проверка результата изменения цены

  • Добавьте в корзину товар, относящийся к категории «sale».
  • Перейдите на страницу корзины — цена должна отобразиться с учётом скидки.
  • Убедитесь, что в админке цена товара не меняется — скидка применяется только в корзине.

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

Изменение цены только в корзине может быть недостаточно. Чтобы отобразить новую цену на странице товара и каталога, нужно использовать фильтр woocommerce_get_price_html, который отвечает за вывод цены.

add_filter('woocommerce_get_price_html', 'custom_price_html_for_sale_category', 100, 2);
function custom_price_html_for_sale_category( $price, $product ) {
    if ( has_term( 'sale', 'product_cat', $product->get_id() ) ) {
        $regular_price = $product->get_regular_price();
        $discounted_price = $regular_price * 0.9;
        $price = wc_price( $discounted_price ) . ' <del>' . wc_price( $regular_price ) . '</del>';
    }
    return $price;
}

Этот код показывает цену со скидкой и зачёркнутую исходную цену для товаров из категории «sale».

Чек-лист для внедрения автоматизации изменения цены в WooCommerce

  • Определить условие изменения цены (категория, количество, дата, пользователь и т.п.)
  • Использовать woocommerce_before_calculate_totals для изменения цены в корзине
  • Для отображения цены в каталоге использовать woocommerce_get_price_html
  • Проверить, что цены меняются корректно без влияния на базовую цену товара
  • Провести тесты с разными ролями пользователей и разнообразными товарами
  • Убедиться, что не возникает конфликтов с другими плагинами скидок

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

После добавления кода в файл functions.php или в отдельный плагин, выполните:

  • Очистите кэш сайта и браузера
  • Добавьте в корзину товар из категории «sale»
  • Проверьте цену в корзине и на странице товара
  • Измените количество товара, чтобы убедиться, что цена пересчитывается
  • Проверьте, что цены на товары вне категории «sale» не изменились

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

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

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

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

Сравнение подходов к изменению цены в WooCommerce

МетодОписаниеПлюсыМинусы
Фильтр woocommerce_before_calculate_totalsДинамическое изменение цены в корзинеГибко, не меняет базу данныхЦена меняется только в корзине
Фильтр woocommerce_get_price_htmlИзменение отображаемой цены на страницах магазинаВизуально понятно для пользователяЦена не изменяется в корзине и заказе без woocommerce_before_calculate_totals
Изменение цены товара через метаполяИзменение цены в базе данныхЦена изменяется повсеместноРиск ошибок, сложность отката изменений
Как автоматизировать управление кэшом в WordPress
10.04.2026
Как создать собственный шорткод WordPress: подробное руководство с примерами
10.11.2025
Решение проблемы неработающих фильтров по атрибутам в WooCommerce после обновления
03.05.2026
Как использовать хуки для автоматизации в WordPress
17.12.2025
Как удалить и заблокировать удалённые пользователи WordPress
12.02.2026