В чем заключается задача автоматического изменения цены по акции
В интернет-магазине на 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 | Нет автоматического снятия скидки, ограниченная логика |
| Плагины для акций | Много функций, удобный интерфейс | Дополнительные расходы, нагрузка на сайт |
| Кастомный код через хуки | Гибкость, без лишних плагинов | Требует навыков, возможны баги без тестов |