Диагностика задачи: зачем и когда нужно автоматическое изменение цен в WooCommerce
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически менять цены или скидки на товары по расписанию: например, запускать акцию на выходные, повышать цены в определённые дни или временно отключать скидки. Сделать это вручную неудобно и чревато ошибками. Многие ищут готовые плагины, но они часто избыточны или конфликтуют с другими расширениями.
Решение – реализовать автоматическое изменение цены и скидок через собственный код с использованием WP-Cron и стандартных функций WooCommerce. В этой статье покажу, как сделать это на примере изменения цены и скидок с точным расписанием, без сторонних плагинов.
Пошаговое решение: реализация автоматического изменения цен и скидок в WooCommerce
1. Определяем расписание и товары для изменения цен
Для начала решим, по какому расписанию будем менять цены. Допустим, нужно установить скидку 20% на определённые категории товаров с пятницы 00:00 до воскресенья 23:59.
2. Создаём функцию для применения скидки
Далее напишем функцию, которая пройдётся по нужным товарам и изменит их цену.
function wpb_apply_weekend_discount() {
if ( ! class_exists('WooCommerce') ) return;
$today = current_time('w'); // 5=пятница,6=суббота,0=воскресенье
if ( in_array($today, array(5,6,0)) ) {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('sale-category') // Замените на вашу категорию
)
)
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$product = wc_get_product( get_the_ID() );
$regular_price = floatval($product->get_regular_price());
if ( $regular_price > 0 ) {
$sale_price = $regular_price * 0.8; // скидка 20%
$product->set_sale_price( $sale_price );
$product->save();
}
endwhile;
wp_reset_postdata();
} else {
// В остальные дни снимаем скидки
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('sale-category')
)
)
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$product = wc_get_product( get_the_ID() );
if ( $product->get_sale_price() ) {
$product->set_sale_price('');
$product->save();
}
endwhile;
wp_reset_postdata();
}
}3. Запускаем функцию по расписанию через WP-Cron
Создадим событие WP-Cron, которое будет запускать эту функцию ежедневно в полночь.
function wpb_schedule_discount_cron() {
if ( ! wp_next_scheduled( 'wpb_daily_discount_event' ) ) {
wp_schedule_event( strtotime('00:00:00'), 'daily', 'wpb_daily_discount_event' );
}
}
add_action( 'wp', 'wpb_schedule_discount_cron' );
add_action( 'wpb_daily_discount_event', 'wpb_apply_weekend_discount' );Проверка результата: как убедиться, что скидки применились
- Посмотреть страницу с товарами из категории
sale-categoryв пятницу, субботу и воскресенье — цены должны отображаться со скидкой 20%. - В другие дни скидки должны автоматически сниматься.
- Можно проверить в админке WooCommerce на странице редактирования товара, отображается ли поле "Цена со скидкой" с нужным значением.
- Логирование: для отладки можно добавить запись в лог при каждом запуске функции, например через
error_log().
Частые ошибки и как их исправить
- Скидки не применяются: Проверьте, активен ли WP-Cron на сайте, нет ли конфликтов с другими плагинами, и правильно ли указана категория товаров.
- Функция запускается чаще, чем нужно: Убедитесь, что хук для планировщика установлен только один раз. Используйте
wp_next_scheduled()для проверки. - Цены не обновляются на фронтенде: Очистите кеш сайта и браузера, проверьте, не конфликтует ли кеширование с динамическим обновлением цен.
- Ошибка при сохранении товара: Убедитесь, что функция вызывается в подходящий момент, и объект продукта корректно инициализирован.
Практические советы по производительности и безопасности
- Если товаров много, разбейте обновление на части через batch-обработку, чтобы избежать таймаутов.
- Используйте транзиенты для кеширования результатов выборки товаров, если расписание меняется редко.
- Для безопасности не меняйте цены напрямую в базе — используйте методы API WooCommerce (
set_sale_price,save). - Для дополнительного контроля добавьте проверку прав пользователя, если функция вызывается из админки.
Сравнение подходов: код vs плагины для автоматического изменения цен
| Метод | Плюсы | Минусы |
|---|---|---|
| Собственный код WP-Cron + WooCommerce API | Максимальная гибкость, нет лишних зависимостей, легко адаптировать под задачи | Требует навыков программирования, возможны ошибки при реализации |
| Плагины автоматизации скидок (например, WooCommerce Dynamic Pricing) | Готовое решение, удобный интерфейс, поддержка сложных правил | Стоимость, возможные конфликты, нагрузка на сайт, избыточность для простых задач |