Диагностика задачи: зачем автоматизировать изменение цен по акциям
В WooCommerce часто возникает необходимость массово менять цены товаров во время распродаж или акций. Ручное изменение каждого товара неудобно и чревато ошибками. Автоматизация с помощью кода позволяет задавать правила скидок и применять их сразу ко множеству товаров, экономя время и снижая вероятность человеческого фактора.
Как работает автоматическое изменение цен в WooCommerce
WooCommerce хранит базовую цену товара в метаполе _regular_price и цену со скидкой в _sale_price. Чтобы применить акцию, достаточно программно установить значение _sale_price и задать дату начала и окончания скидки (_sale_price_dates_from и _sale_price_dates_to).
Важно: просто менять отображаемую цену через фильтры недостаточно — нужно обновлять метаданные товара, чтобы скидка учитывалась корректно в корзине, при оплате и отчетах.
Пошаговое решение: как автоматически обновить цены товаров по акции с помощью кода
1. Подготовка функции для массового изменения цен
function wpsell_apply_sale_discount( $category_slug, $discount_percent, $date_from = null, $date_to = null ) {
// Получаем товары указанной категории
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $category_slug,
],
],
'fields' => 'ids',
];
$product_ids = get_posts( $args );
foreach ( $product_ids as $product_id ) {
$regular_price = get_post_meta( $product_id, '_regular_price', true );
if ( ! $regular_price || $regular_price <= 0 ) {
continue; // Пропускаем товары без базовой цены
}
// Вычисляем цену со скидкой
$sale_price = round( $regular_price * (1 - $discount_percent / 100), 2 );
// Обновляем метаданные
update_post_meta( $product_id, '_sale_price', $sale_price );
update_post_meta( $product_id, '_price', $sale_price ); // Текущая цена
if ( $date_from ) {
update_post_meta( $product_id, '_sale_price_dates_from', strtotime( $date_from ) );
}
if ( $date_to ) {
update_post_meta( $product_id, '_sale_price_dates_to', strtotime( $date_to ) );
}
// Обязательно сбрасываем кеш
wc_delete_product_transients( $product_id );
}
}
2. Запуск функции с параметрами акции
Например, чтобы применить 20% скидку на все товары категории sale с сегодняшнего дня по 7 дней:
wpsell_apply_sale_discount('sale', 20, date('Y-m-d'), date('Y-m-d', strtotime('+7 days')));
3. Автоматизация запуска через WP-Cron
Чтобы запускать акцию автоматически, можно повесить вызов функции на cron-задачу. Пример регистрации и запуска:
if ( ! wp_next_scheduled( 'wpsell_run_sale_discount' ) ) {
wp_schedule_event( time(), 'daily', 'wpsell_run_sale_discount' );
}
add_action( 'wpsell_run_sale_discount', function() {
wpsell_apply_sale_discount('sale', 20, date('Y-m-d'), date('Y-m-d', strtotime('+7 days')));
});
Как проверить, что автоматическое изменение цен сработало
- Откройте товар из целевой категории в админке и проверьте метаполя
_sale_priceи_priceчерез редактор или с помощью плагина Advanced Custom Fields или WP All Import. - На фронтенде товара должна отображаться цена со скидкой и таймер акции (если тема поддерживает).
- Добавьте товар в корзину — цена должна быть со скидкой.
- Проверьте отчет WooCommerce по продажам — отображаемая цена должна быть снижена.
Частые ошибки и как их исправить
- Не обновлена цена _price: если не обновить метаполе
_price, WooCommerce может показывать старую цену. Важно обновлять и это поле. - Неправильный формат даты: даты для
_sale_price_dates_fromи_sale_price_dates_toдолжны быть timestamp (целые числа), а не строки. Используйтеstrtotime(). - Отсутствие сброса кеша: после обновления цен нужно вызвать
wc_delete_product_transients()для сброса кеша и корректного отображения. - Кэширование на уровне сервера: если используется внешний кэш (например, Redis, Varnish), возможно, придется его очистить вручную.
- WP-Cron не срабатывает: убедитесь, что на сайте есть трафик или настроен системный cron запуск для wp-cron.php.
Практические советы по безопасности и производительности
- Не запускайте массовое обновление цен на страницах фронтенда или при каждом запросе — используйте ajax, WP-Cron или ручной запуск из админки.
- При большом количестве товаров разбивайте обновления на пакеты, чтобы избежать таймаутов и перегрузок сервера.
- Используйте транзиенты и кеширование для снижения нагрузки на базу, но очищайте их при изменении цен.
- Ограничьте права на запуск функций изменения цен только администраторам.
- Перед массовыми изменениями делайте резервные копии базы данных.
Таблица сравнения способов автоматической установки скидок
| Метод | Плагин | Код | Компромисс |
|---|---|---|---|
| Установка скидок массово | Плагины типа "Bulk Discounts" или "Advanced Coupons" | Кастомные функции и WP-Cron | Плагины проще, но могут нагружать сайт; код гибче, требует поддержки |
| Автоматический запуск | Плагины с расписанием или сторонние сервисы | WP-Cron с кастомными хуками | Плагины удобны для непрофи; код — более надежен и настраиваем |
| Управление условиями | Плагины с интерфейсом условий и правил | Кастомные фильтры и условия внутри функций | Плагины дают визуальный контроль, код — требует знаний PHP |