Автоматическое изменение цены товара по акции в WooCommerce

В чем заключается задача автоматического изменения цены по акции

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

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

WooCommerce предлагает стандартные возможности по установке распродажной цены (sale price), но они не всегда удобны для сложных сценариев:

  • Невозможно задать условия, например, изменение цены в зависимости от количества заказов.
  • Нет автоматического отключения акции по окончании даты без ручного вмешательства.
  • Сложно комбинировать акции с другими плагинами или кастомными статусами заказов.

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

1. Добавление пользовательских полей даты начала и окончания акции

Для управления акциями используем два метаполя: promo_start и promo_end. Их можно добавить через Advanced Custom Fields (ACF) или вручную:

function add_promo_date_fields() {
    add_meta_box('promo_dates', 'Даты акции', function($post) {
        $start = get_post_meta($post->ID, 'promo_start', true);
        $end = get_post_meta($post->ID, 'promo_end', true);
        echo '<label>Дата начала акции:</label><input type="date" name="promo_start" value="' . esc_attr($start) . '" /><br/>';
        echo '<label>Дата окончания акции:</label><input type="date" name="promo_end" value="' . esc_attr($end) . '" />';
    }, 'product', 'side');
}
add_action('add_meta_boxes', 'add_promo_date_fields');

2. Сохранение пользовательских полей

function save_promo_dates($post_id) {
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if (isset($_POST['promo_start'])) {
        update_post_meta($post_id, 'promo_start', sanitize_text_field($_POST['promo_start']));
    }
    if (isset($_POST['promo_end'])) {
        update_post_meta($post_id, 'promo_end', sanitize_text_field($_POST['promo_end']));
    }
}
add_action('save_post_product', 'save_promo_dates');

3. Автоматическое применение скидочной цены по условию в front-end

Используем хук woocommerce_get_price для динамического изменения цены товара при выводе на сайте.

function apply_promo_price($price, $product) {
    $start = get_post_meta($product->get_id(), 'promo_start', true);
    $end = get_post_meta($product->get_id(), 'promo_end', true);
    $promo_price = get_post_meta($product->get_id(), '_promo_price', true); // кастомное поле для цены по акции
    $today = date('Y-m-d');
    if ($start && $end && $promo_price) {
        if ($today >= $start && $today <= $end) {
            return floatval($promo_price);
        }
    }
    return $price;
}
add_filter('woocommerce_product_get_price', 'apply_promo_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'apply_promo_price', 10, 2);

4. Добавление поля "цена по акции" в админку товара

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

function add_promo_price_field() {
    woocommerce_wp_text_input(array(
        'id' => '_promo_price',
        'label' => 'Цена по акции',
        'desc_tip' => 'true',
        'description' => 'Укажите цену товара во время акции',
        'type' => 'number',
        'custom_attributes' => array(
            'step' => '0.01',
            'min' => '0'
        )
    ));
}
add_action('woocommerce_product_options_pricing', 'add_promo_price_field');

function save_promo_price_field($post_id) {
    $promo_price = isset($_POST['_promo_price']) ? wc_format_decimal($_POST['_promo_price']) : '';
    update_post_meta($post_id, '_promo_price', $promo_price);
}
add_action('woocommerce_process_product_meta', 'save_promo_price_field');

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

  • В админке товара задать даты акции и цену по акции.
  • Убедиться, что на фронтенде при текущей дате цена товара меняется на акционную.
  • Проверить, что вне периода акции отображается обычная цена.
  • Проверить разные типы товаров (простые, вариации).

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

  • Дата введена в неверном формате — использовать формат Y-m-d для совместимости с PHP-функцией date().
  • Не сохраняется цена по акции — проверить, что поле _promo_price корректно добавлено и сохраняется.
  • Цена не меняется на фронтенде — проверить наличие фильтров woocommerce_product_get_price и woocommerce_product_get_regular_price, возможны конфликты с другими плагинами.
  • Акция не заканчивается автоматически — убедиться, что даты правильно сравниваются по часовому поясу сервера.

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

  • Используйте sanitize_text_field и wc_format_decimal для очистки данных из формы.
  • Кешируйте результаты вычисления цены, если на сайте много товаров с акциями.
  • Тестируйте на staging-сервере перед запуском на боевом.
  • Если необходимо массовое обновление акций, используйте WP CLI или отдельные скрипты.

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

МетодПлюсыМинусы
Встроенный sale priceПростота, поддержка WooCommerceНет автоматического снятия скидки, ограниченная логика
Плагины для акцийМного функций, удобный интерфейсДополнительные расходы, нагрузка на сайт
Кастомный код через хукиГибкость, без лишних плагиновТребует навыков, возможны баги без тестов
Автоматизация обновления метаданных товаров WooCommerce в WordPress
07.04.2026
Как удалить кэш в WordPress при изменении шаблонов и плагинов
05.12.2025
Автоматическое создание отчёта по заказам в WordPress с фильтрами и примерами кода
18.02.2026
Автоматическое удаление старых заказов в WordPress: практическое руководство
08.12.2025
Автоматическое создание отчёта по просмотрам и активности пользователей в WordPress
03.01.2026