Диагностика задачи: зачем менять цены по расписанию в WooCommerce
В интернет-магазинах часто требуется автоматически менять цены на товары в определённое время — например, для проведения акций, распродаж, или сезонных скидок. Ручное изменение цен неудобно и чревато ошибками, особенно при большом ассортименте. WooCommerce не предлагает встроенного функционала для автоматической корректировки цен по расписанию, поэтому приходится решать задачу программно.
Как работает расписание изменения цен в WooCommerce: обзор подхода
Основная идея — создать WP-Cron задачу, которая будет в нужное время запускать функцию изменения цен. Эта функция проходит по товарам и обновляет цену (например, стоимость продаж или базовую цену) согласно заданным условиям. Для активации расписания достаточно добавить код в functions.php темы или в свой плагин.
Почему WP-Cron, а не системный cron
WP-Cron запускается при заходе посетителей на сайт, что достаточно для большинства сайтов. Если нужен точный cron, его можно настроить через сервер, но WP-Cron — простой и универсальный вариант.
Пошаговое решение: код для автоматического изменения цен по расписанию
1. Регистрируем событие WP-Cron
if (!wp_next_scheduled('custom_price_update_cron')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'custom_price_update_cron');
}Это создаст ежедневное событие в полночь.
2. Создаем функцию обновления цен
add_action('custom_price_update_cron', 'update_product_prices_by_schedule');
function update_product_prices_by_schedule() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
];
$products = get_posts($args);
foreach ($products as $product_post) {
$product = wc_get_product($product_post->ID);
if (!$product) continue;
// Пример: применяем скидку 10% на все товары
$regular_price = $product->get_regular_price();
if ($regular_price) {
$new_price = $regular_price * 0.9; // скидка 10%
$product->set_sale_price($new_price);
$product->save();
}
}
}3. Очистка цен после окончания акции
Чтобы убрать скидку после определённой даты, можно добавить еще одно cron-событие или расширить текущую функцию проверкой даты и сбросом цены.
function reset_sale_prices() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
];
$products = get_posts($args);
foreach ($products as $product_post) {
$product = wc_get_product($product_post->ID);
if (!$product) continue;
// Сброс скидочной цены
$product->set_sale_price('');
$product->save();
}
}
// Зарегистрировать cron для сброса, например, через неделю после начала акции
if (!wp_next_scheduled('custom_price_reset_cron')) {
wp_schedule_event(strtotime('+7 days 00:00:00'), 'daily', 'custom_price_reset_cron');
}
add_action('custom_price_reset_cron', 'reset_sale_prices');Проверка результата после внедрения
- Перейдите в WooCommerce > Товары и выберите товар, у которого должна измениться цена.
- Проверьте, что цена продаж изменилась согласно расписанию.
- Для проверки cron-заданий используйте плагин WP Crontrol — он покажет запланированные задачи и позволит запустить их вручную.
- Включите логирование ошибок PHP для отладки, если цены не меняются.
Частые ошибки и как их исправить
- WP-Cron не запускается: если на сайт редко заходят посетители, cron-задачи не запускаются. Решение — настроить системный cron или вручную запускать через WP Crontrol.
- Функция не обновляет цену: проверьте, что продукт получен через
wc_get_product()и что цена есть. Убедитесь, что вызывается$product->save(). - Цена меняется, но в магазине не отображается: очистите кэш сайта и браузера, проверьте кэш плагинов.
- Хранение цены в метаданных: не меняйте напрямую мета-поля
_price, используйте методы WooCommerce для обновления цен.
Практические советы по безопасности и производительности
- Не обновляйте одновременно слишком много товаров — для больших магазинов разбивайте задачи на батчи (например, по 50 товаров за один запуск).
- Добавьте проверку nonce или прав доступа, если планируете запускать обновление через AJAX-запросы.
- При использовании WP-Cron на высоконагруженных сайтах разумно переключиться на системный cron для стабильности.
- Перед изменением цен сделайте резервную копию базы данных, чтобы можно было откатить изменения.
Сравнение вариантов реализации автоматического изменения цен
| Способ | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP-Cron + кастомный код | Простота, гибкость, не требует плагинов | Зависит от посещаемости сайта, требует навыков программирования | Подходит для малого и среднего магазина |
| Системный cron + кастомный код | Точный запуск, стабильность | Требует доступа к серверу, технические знания | Лучше для больших сайтов с большим трафиком |
| Плагины для акций и скидок | Удобный интерфейс, готовые функции | Часто платные, могут нагружать сайт | Хорошо для магазинов без разработчиков |