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

Диагностика проблемы с изменением стоимости товаров в WooCommerce

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

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

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

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

Реализация заключается в динамическом изменении отображаемой цены и цены на уровне корзины и оформления заказа с помощью хука, без изменения самой цены товара в базе данных.

Вставьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:

add_filter('woocommerce_product_get_price', 'custom_dynamic_sale_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_sale_price', 10, 2);
add_filter('woocommerce_get_price_html', 'custom_dynamic_price_html', 10, 2);

function custom_dynamic_sale_price($price, $product) {
    // Проверяем, активна ли акция (например, по дате или метке)
    $sale_active = false;
    $current_time = current_time('timestamp');
    $sale_start = strtotime('2024-07-01 00:00:00');
    $sale_end = strtotime('2024-07-10 23:59:59');

    if ($current_time >= $sale_start && $current_time <= $sale_end) {
        $sale_active = true;
    }

    if ($sale_active) {
        // Например, скидка 15%
        $price = $price * 0.85;
    }

    return $price;
}

function custom_dynamic_price_html($price_html, $product) {
    $price = $product->get_price();
    $regular_price = $product->get_regular_price();

    if ($price < $regular_price) {
        $price_html = '<del>' . wc_price($regular_price) . '</del> <ins>' . wc_price($price) . '</ins>';
    } else {
        $price_html = wc_price($price);
    }

    return $price_html;
}

Объяснение кода

  • custom_dynamic_sale_price изменяет цену товара на лету, проверяя дату проведения акции.
  • Используется скидка 15%, которую можно адаптировать под ваши условия.
  • custom_dynamic_price_html корректно отображает цену с зачёркнутой старой и новой ценой.

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

  1. Установите системные даты на время проведения акции или измените даты в коде под текущий момент.
  2. Перейдите на страницу товара — цена должна отображаться с зачёркнутой старой ценой и новой сниженной.
  3. Добавьте товар в корзину и перейдите к оформлению заказа — цена там также должна быть снижена.
  4. Проверьте, что в базе данных в админке цена товара осталась неизменной, т.е. акция проходит без изменения записей.

Частые ошибки и способы их исправления

  • Цена не меняется на фронтенде: Проверьте, что даты акции корректны и время сервера совпадает с локальным временем сайта (функция current_time('timestamp')).
  • Пересчёт цены происходит, но отображение некорректно: Убедитесь, что фильтр woocommerce_get_price_html применяется с приоритетом 10 и что нет конфликтов с другими плагинами, которые изменяют цену.
  • Вариации товаров не изменяют цену: Для вариаций может потребоваться добавить тот же фильтр, но с проверкой на объект вариации WC_Product_Variation.

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

  • Не изменяйте цены напрямую в базе при акциях. Используйте динамические фильтры, чтобы избежать конфликтов и сохранить целостность данных.
  • Кэширование. При использовании кэша (например, object cache или плагинов кеширования) убедитесь, что цена обновляется корректно и кэш сбрасывается при старте и окончании акции.
  • Локализация и форматирование цены. Используйте функции WooCommerce wc_price() для корректного отображения цен с валютой и локализацией.

Альтернативы: плагин vs код

МетодПлюсыМинусыКомпромисс
Плагин для акций (например, WooCommerce Dynamic Pricing)Простая настройка, UI, поддержка разных условийМожет влиять на производительность, не всегда гибко для нестандартных сценариевИспользовать для простых задач
Код на хуках (как в статье)Легко контролировать, не влияет на БД, гибкоТребует навыков программирования, можно ошибиться с датамиИдеально для разработчиков, настроенных под проект

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как автоматически удалить неиспользуемые типы постов WordPress
12.02.2026
WooCommerce: как избежать дублирования товаров при импорте из osCommerce
20.05.2026
WooCommerce: как автоматически удалять неактивных клиентов для оптимизации базы
07.07.2026
Как использовать WPRemark для автоматического комментирования в WordPress
16.12.2025
Как автоматизировать отправку отзывов в WordPress: примеры плагинов и кода
23.02.2026
×
WPRemark
Внимание Внимание Внимание Внимание
-15%

на WPRemark плагин WordPress

Прокачай свой сайт! ⋙