Диагностика задачи: зачем нужна автоматизация цен на акции
В WooCommerce часто возникает необходимость автоматически менять цены товаров в рамках акций, например, скидки действуют только в определённый период. Ручное обновление цен неудобно и приводит к ошибкам — например, скидка не отключается вовремя или не включается в нужный день. Чтобы избежать таких проблем, надо автоматизировать процесс с помощью кода.
Как автоматически менять цены товаров по дате в WooCommerce
Выбор подхода: изменение цены напрямую или через скидки
В WooCommerce можно менять цену товара двумя способами:
- Прямое изменение цены
regular_priceилиsale_priceв мета-данных товара. - Использование поля
sale_priceиsale_price_dates_from,sale_price_dates_toдля установки периода акции.
Второй способ предпочтительнее, так как WooCommerce учитывает периоды акции и автоматически применяет скидку.
Пример кода для автоматического включения и выключения скидок по расписанию
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('init', 'auto_set_sale_price_by_date');
function auto_set_sale_price_by_date() {
if ( wp_doing_cron() ) {
return; // избегаем вызов во время cron
}
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_auto_sale_start',
'compare' => 'EXISTS',
],
],
];
$products = get_posts($args);
$now = current_time('Y-m-d');
foreach ( $products as $product_post ) {
$product = wc_get_product($product_post->ID);
$start_date = get_post_meta($product->get_id(), '_auto_sale_start', true);
$end_date = get_post_meta($product->get_id(), '_auto_sale_end', true);
$sale_price = get_post_meta($product->get_id(), '_auto_sale_price', true);
if ( !$start_date || !$end_date || !$sale_price ) {
continue;
}
if ( $now >= $start_date && $now <= $end_date ) {
// В период акции включаем скидку
$product->set_sale_price($sale_price);
$product->set_date_on_sale_from(strtotime($start_date));
$product->set_date_on_sale_to(strtotime($end_date));
$product->save();
} else {
// Вне периода акции сбрасываем скидку
$product->set_sale_price('');
$product->set_date_on_sale_from('');
$product->set_date_on_sale_to('');
$product->save();
}
}
}В этом коде мы предполагаем, что для товаров заданы пользовательские мета-поля:
_auto_sale_start— дата начала акции в форматеYYYY-MM-DD_auto_sale_end— дата окончания акции_auto_sale_price— цена со скидкой
Вы можете задать эти поля вручную или через админку с помощью Advanced Custom Fields или другого плагина.
Добавление задачи в планировщик WP-Cron для автоматизации обновлений
Чтобы скидки автоматически включались и выключались без ручного вызова функции, зарегистрируйте cron-задание:
add_action('wp', 'auto_sale_schedule_cron');
function auto_sale_schedule_cron() {
if ( ! wp_next_scheduled( 'auto_sale_update_event' ) ) {
wp_schedule_event(time(), 'hourly', 'auto_sale_update_event');
}
}
add_action('auto_sale_update_event', 'auto_set_sale_price_by_date');Этот код запускает проверку скидок каждый час. Вы можете изменить интервал на дневной, если хотите.
Проверка результата после внедрения
Чтобы убедиться, что автоматическое изменение цен работает:
- Проверьте в админке, что у нужных товаров заполнены мета-поля
_auto_sale_start,_auto_sale_end,_auto_sale_price. - Запустите функцию вручную (например, через WP-CLI или временно вызовом
auto_set_sale_price_by_date()вfunctions.php) и проверьте, изменились ли цены и даты начала/окончания акции. - Посмотрите карточку товара на сайте — цена должна отображаться как со скидкой в период акции.
- Проверьте, что после окончания периода скидка исчезает и цена возвращается к обычной.
Частые ошибки и способы их исправления
- Скидка не применяется: проверьте правильность формата дат (
YYYY-MM-DD) и наличие мета-полей. - Цены не обновляются автоматически: убедитесь, что cron-задание зарегистрировано и выполняется. Используйте плагин WP Crontrol для просмотра и запуска cron-событий.
- Функция слишком ресурсоёмка: если товаров много, оптимизируйте запросы, добавьте постраничную обработку.
- Проблемы с кешем: если используется кеширование страниц, очистите кеш после изменения цен.
Практические советы по безопасности и производительности
- Не запускайте функцию обновления цен на каждом хите сайта — используйте cron.
- Проверяйте, что мета-поля безопасно заполнены и не содержат вредоносный код.
- Используйте транзиенты или другие кеши для снижения нагрузки при большом количестве товаров.
- Для крупных магазинов рассмотрите решение на уровне стороннего сервера cron вместо WP-Cron.
Сравнение вариантов автоматизации изменения цен в WooCommerce
| Вариант | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное изменение цен | Просто, не требует кода | Ошибка человека, неудобно для акций | Мало товаров, редкие акции |
Использование полей sale_price_dates_from/to | Автоматическое включение/выключение скидок WooCommerce | Нужно заранее задавать даты для каждого товара | Средние магазины с планируемыми акциями |
| Кастомный код с cron | Гибкое управление, можно автоматизировать по сложным правилам | Требует поддержки и отладки | Большие магазины, сложные акции |
| Плагины для управления акциями | Графический интерфейс, дополнительные функции | Может нагружать сайт, стоит денег | Быстрое внедрение без кода |