WooCommerce: автоматическое изменение цен по акциям с помощью кода

Диагностика проблемы: как быстро и гибко менять цены по акциям в WooCommerce

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

Основные вопросы, которые возникают:

  • Как добавить скидку на товар программно, чтобы она автоматически применялась на фронтенде и в корзине?
  • Как учитывать разные условия акции (категории, даты, роли пользователей)?
  • Как правильно применять скидку без конфликтов с другими плагинами и не ломать логику WooCommerce?

Пошаговое решение: пример кода для динамического изменения цены товара по акции

Рассмотрим пример, как программно уменьшить цену товара на 20% для товаров из категории с ID 15, если пользователь авторизован, и акция действует в определённый период.

1. Добавляем фильтр для изменения цены товара на фронтенде и в корзине

add_filter('woocommerce_product_get_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_cart_item_price', 'custom_cart_item_price', 10, 3);

2. Функция для вычисления новой цены

function custom_dynamic_discount_price($price, $product) {
    // Проверяем, что пользователь авторизован
    if (!is_user_logged_in()) {
        return $price;
    }
    
    // Проверяем дату акции
    $start_date = strtotime('2024-06-01');
    $end_date = strtotime('2024-06-10');
    $now = current_time('timestamp');
    if ($now < $start_date || $now > $end_date) {
        return $price;
    }

    // Проверяем, что товар в нужной категории
    if (has_term(15, 'product_cat', $product->get_id())) {
        // Скидка 20%
        $price = $price * 0.8;
    }

    return $price;
}

// Для корректного отображения цены в корзине
function custom_cart_item_price($price_html, $cart_item, $cart_item_key) {
    $product = $cart_item['data'];
    $price = $product->get_price();
    return wc_price($price);
}

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

  • Авторизуйтесь на сайте под пользователем.
  • Откройте страницу товара из категории с ID 15 в период акции (например, 1-10 июня 2024).
  • Убедитесь, что цена товара отображается со скидкой 20%.
  • Добавьте товар в корзину, проверьте, что в корзине цена также снижена.
  • Если пользователь не авторизован или товар не из категории 15, цена должна оставаться без изменений.

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

  • Цена не меняется в корзине или на странице товара. Проверьте, что фильтры подключены правильно. Для корзины нужно дополнительно фильтровать вывод цены через woocommerce_cart_item_price.
  • Скидка применяется всегда. Проверьте условия в функции: даты, категории и авторизацию пользователя.
  • Конфликты с другими плагинами скидок. Иногда другие плагины могут перезаписывать цены. Рекомендуется тестировать на чистом сайте и по возможности использовать приоритеты фильтров.
  • Неправильное отображение цен в заказах и email. Для этого можно добавить аналогичные фильтры для woocommerce_order_get_item_totals или использовать хуки для корректного отображения.

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

  • Лучше избегать вызова тяжелых функций внутри фильтра цены — кэшируйте результаты или используйте transient для условий акции.
  • Проверяйте типы данных, чтобы не вызвать ошибку при подсчёте цен (числа с плавающей точкой).
  • Если акция повторяющаяся, храните даты в настройках темы или плагина, чтобы не менять код.
  • Не используйте пользовательские данные без проверки (например, user roles) — применяйте встроенные функции WordPress.

Сравнение способов реализации скидок в WooCommerce

СпособПреимуществаНедостатки
Плагины скидок (например, WooCommerce Dynamic Pricing)Готовый функционал, UI для настройкиПлатные, могут нагружать сайт
Кодовые решения (фильтры цены)Гибкость, точечное управлениеТребует навыков, возможны ошибки
Использование купоновПросто, встроено в WooCommerceНе всегда подходит для динамических условий
Как добавить защиту от Brute Force атак в WordPress без плагинов
18.02.2026
Как создать автоматический импорт продуктов в WooCommerce из CSV с помощью кода и плагинов
19.03.2026
Как удалить загруженные файлы из медиатеки WordPress полностью
02.12.2025
Как удалить все посты и страницы в WordPress быстро и безопасно
27.11.2025
WooCommerce: автоматическое удаление неактивных клиентов через код
08.07.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше