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

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

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

Основная проблема — корректно и эффективно внедрить изменение цены так, чтобы оно отражалось в корзине, на странице товара и в заказах, без потери данных и конфликтов с кешированием и плагинами скидок.

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

1. Используем фильтр woocommerce_get_price

Этот фильтр позволяет изменить цену товара при выводе на фронтенде и в корзине, не меняя цену в базе.

add_filter('woocommerce_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
    // Пример: скидка 20% на товары категории 'sale'
    if (has_term('sale', 'product_cat', $product->get_id())) {
        $price = $price * 0.8; // уменьшаем цену на 20%
    }
    return $price;
}

2. Учитываем роли пользователя

Чтобы применить скидку только для определённых ролей, добавим проверку:

add_filter('woocommerce_get_price', 'custom_dynamic_price_user_role', 10, 2);
function custom_dynamic_price_user_role($price, $product) {
    if (current_user_can('wholesale_customer') && has_term('wholesale', 'product_cat', $product->get_id())) {
        $price = $price * 0.7; // скидка 30% для оптовых покупателей
    }
    return $price;
}

3. Применяем цену к вариативным товарам

Для вариативных товаров нужно использовать фильтр woocommerce_get_variation_price:

add_filter('woocommerce_get_variation_price', 'custom_variation_price', 10, 2);
function custom_variation_price($price, $variation) {
    if (has_term('sale', 'product_cat', $variation->get_parent_id())) {
        $price = $price * 0.85; // скидка 15%
    }
    return $price;
}

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

  • Откройте страницу товара с изменённой ценой и убедитесь, что цена отображается корректно.
  • Добавьте товар в корзину — цена в корзине должна соответствовать изменённой цене.
  • Оформите заказ и проверьте, что цена в заказе и в письмах соответствует вычисленной.
  • Для вариативных товаров проверьте несколько вариантов.

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

  • Цена не меняется в корзине или на странице товара: Не подключили фильтр с правильным приоритетом или не учитываете тип товара (вариация/простой).
  • Конфликт с плагинами скидок: Плагины могут менять цену после вашего фильтра или кешировать результаты. Проверьте порядок подключения и кеширование.
  • Цена меняется в админке: Не используйте фильтр woocommerce_product_get_price для фронтенда, иначе изменится цена в админке и отчетах.

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

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

Сравнение подходов изменения цены

МетодПлюсыМинусы
Фильтр woocommerce_get_priceНе меняет базу, легко внедрятьНе всегда подходит для комплексных скидок
Изменение цены в базе данных (meta)Цена меняется глобальноРиск потери данных, сложность возврата
Плагины динамического ценообразованияГотовые решения, удобный интерфейсСтоимость, зависимость от стороннего кода
Как избежать конфликтов между плагинами в WordPress
26.12.2025
Исключение товаров и вариантов WooCommerce по атрибуту: практическое руководство
22.04.2026
Как исключить варианты товаров WooCommerce по атрибуту
19.04.2026
Оптимизация базы данных WordPress для ускорения сайта
03.11.2025
Как удалить оставшиеся задачи WP-Cron в WordPress
08.03.2026