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

Диагностика проблемы: почему автоматизация ценовых акций важна

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

Как работает автоматическое обновление цены в WooCommerce

WooCommerce хранит цену товара в метаполях _price, _regular_price и _sale_price. Для акций обычно используется _sale_price, а также даты начала и окончания акции — _sale_price_dates_from и _sale_price_dates_to. Логика обновления состоит в том, чтобы программно выставить эти метаданные для нужных товаров и сбросить кэш цены.

Ключевые хуки и функции для решения задачи

  • update_post_meta() — для установки цены и дат акции
  • wc_get_product() — для получения объекта товара
  • clean_post_cache() — для обновления кеша товара
  • wp_schedule_event() и wp_clear_scheduled_hook() — для планирования автоматического обновления

Пошаговое решение: автоматическое применение скидки на товар

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

function apply_sale_price_to_product($product_id, $discount_percent, $sale_start, $sale_end) {
    $product = wc_get_product($product_id);
    if (!$product) {
        return false;
    }
    $regular_price = (float) $product->get_regular_price();
    if ($regular_price <= 0) {
        return false;
    }
    $sale_price = round($regular_price * (1 - $discount_percent / 100), 2);

    update_post_meta($product_id, '_sale_price', $sale_price);
    update_post_meta($product_id, '_sale_price_dates_from', strtotime($sale_start));
    update_post_meta($product_id, '_sale_price_dates_to', strtotime($sale_end));
    update_post_meta($product_id, '_price', $sale_price);
    clean_post_cache($product_id);
    return true;
}

2. Пример вызова функции

$product_id = 123; // ID товара
$discount_percent = 20; // скидка 20%
$sale_start = '2024-07-01 00:00:00';
$sale_end = '2024-07-07 23:59:59';
apply_sale_price_to_product($product_id, $discount_percent, $sale_start, $sale_end);

3. Автоматизация запуска акции по расписанию

Чтобы запускать акции автоматически, можно создать WP Cron задачу. Пример:

function schedule_sale_event() {
    if (!wp_next_scheduled('update_sale_prices_hook')) {
        wp_schedule_event(time(), 'daily', 'update_sale_prices_hook');
    }
}
add_action('wp', 'schedule_sale_event');

add_action('update_sale_prices_hook', 'update_sale_prices_callback');

function update_sale_prices_callback() {
    // Здесь логика по выбору товаров и применению скидок
    $products_on_sale = [123, 124, 125];
    $discount_percent = 15;
    $sale_start = date('Y-m-d H:i:s');
    $sale_end = date('Y-m-d H:i:s', strtotime('+3 days'));
    foreach ($products_on_sale as $product_id) {
        apply_sale_price_to_product($product_id, $discount_percent, $sale_start, $sale_end);
    }
}

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

  • Перейдите в админку WooCommerce, откройте карточку товара и убедитесь, что в полях "Цена распродажи" и датах акции появились новые значения.
  • На фронтенде товара должна отображаться цена со скидкой в указанный период.
  • Проверьте, что цена возвращается к обычной после окончания акции (через очистку метаполей или автоматический скрипт).
  • Используйте WP CLI команду wp post meta get 123 _sale_price для проверки мета-значений из консоли.

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

  • Цена не обновляется на фронтенде: Проверьте, очищается ли кеш товара через clean_post_cache(). Без этого WooCommerce может показывать старую цену.
  • Дата акции не учитывается: WooCommerce требует, чтобы даты были в формате timestamp. Обязательно используйте strtotime() для конвертации.
  • Скидка больше цены: Добавьте проверку, чтобы итоговая цена не была меньше нуля.
  • WP Cron не запускается: Убедитесь, что сайт получает трафик, или настройте системный cron для wp-cron.php.

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

  • Если у вас тысячи товаров, не обновляйте цены всех сразу — разбивайте на пакеты по 50–100, чтобы избежать таймаутов.
  • Храните даты акций в UTC, чтобы избежать проблем с часовыми поясами.
  • Используйте nonce и проверку прав в административных функциях для безопасности при ручном запуске обновлений.
  • Для массовых акций лучше использовать WP CLI, это надежнее и производительнее.

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

МетодОписаниеПреимуществаНедостатки
Ручное обновление в админкеРедактирование цены и дат вручнуюПростотаМного времени при большом каталоге
PHP код с хуками и WP CronАвтоматизация через код и регулярные задачиГибкость, масштабируемостьТребует навыков программирования
Плагины для акцийГотовые решения с интерфейсомУдобство для неразработчиковМожет нагружать сайт и платить за лицензии
Как автоматизировать подгон изображений в WordPress с помощью AI
27.03.2026
WooCommerce: автоматическое создание уникальных SKU для товаров
09.05.2026
WooCommerce: автоматическое удаление закрытых и неактивных заказов через код
31.05.2026
Как автоматизировать отслеживание изменений в WordPress с помощью AI
17.03.2026
Оптимизация базы данных WordPress: удаление старых записей и ревизий
26.11.2025