Проблема: зачем нужно автоматическое изменение цен по расписанию
В интернет-магазинах на WooCommerce часто требуется менять цены товаров не вручную, а автоматически — например, для акций, распродаж, сезонных скидок или динамического ценообразования. Ручное обновление неэффективно и чревато ошибками, особенно при большом каталоге. В этой статье разберём, как реализовать изменение цен по расписанию средствами WordPress и WooCommerce без сторонних плагинов.
Диагностика: как понять, что цены не меняются автоматически
Если вы пытались настроить автоматические скидки через стандартные функции WooCommerce или плагины, но цены не меняются в нужное время, проверьте:
- Активность WP-Cron — возможно, он отключён или не работает.
- Правильность времени сервера и временной зоны в WordPress.
- Корректность написания кода, назначающего события и изменяющего цены.
- Отсутствие конфликтов с другими плагинами, кешированием или оптимизацией.
Пошаговое решение: как настроить автоматическое изменение цен по расписанию
1. Проверяем и настраиваем WP-Cron
WP-Cron отвечает за выполнение запланированных задач. Убедитесь, что он работает. В wp-config.php не должно быть строки define('DISABLE_WP_CRON', true);.
Для проверки запланированных событий установите плагин WP Crontrol. В разделе "Cron Events" вы увидите список текущих событий.
2. Создаём функцию для изменения цены товара
Пример функции, которая меняет цену конкретного товара по ID:
function wpc_change_product_price($product_id, $new_price) {
$product = wc_get_product($product_id);
if (!$product) return false;
$product->set_regular_price($new_price);
// Если нужно, можно изменить и цену продажи:
// $product->set_sale_price($new_sale_price);
$product->save();
return true;
}3. Создаём функцию, которая будет запускаться по расписанию
function wpc_cron_update_prices() {
// Пример: меняем цену товара с ID 123 на 999 рублей
wpc_change_product_price(123, 999);
// Можно добавить логику для нескольких товаров
// Например, массив товаров и новых цен
$prices = [
124 => 799,
125 => 499,
];
foreach ($prices as $id => $price) {
wpc_change_product_price($id, $price);
}
}4. Регистрируем событие в WP-Cron
Добавляем проверку и регистрацию события в functions.php темы или в собственном плагине:
if (!wp_next_scheduled('wpc_daily_price_update')) {
// Запускаем задачу раз в сутки, можно изменить на нужный интервал
wp_schedule_event(time(), 'daily', 'wpc_daily_price_update');
}
add_action('wpc_daily_price_update', 'wpc_cron_update_prices');5. Настраиваем собственный интервал, если нужно
По умолчанию WP-Cron поддерживает интервалы 'hourly', 'twicedaily', 'daily'. Для других интервалов добавьте:
add_filter('cron_schedules', function($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300, // 5 минут в секундах
'display' => __('Каждые 5 минут'),
];
return $schedules;
});И замените 'daily' в wp_schedule_event на 'every_five_minutes' для более частого обновления.
Проверка результата после внедрения
- В разделе WP-Cron (с помощью WP Crontrol) проверьте, что событие
wpc_daily_price_updateзапланировано. - Запустите событие вручную через WP Crontrol — проверьте, что цены изменились.
- Проверьте страницу товара на фронтенде и в админке, что цена обновилась.
- Если цены не меняются, проверьте логи ошибок PHP и включите отладку WordPress (
define('WP_DEBUG', true);).
Частые ошибки и их исправление
- WP-Cron отключен или не срабатывает: Проверьте
wp-config.phpи настройте системный cron для вызоваwp-cron.php(рекомендуется для стабильности). - Неправильный ID товара: Убедитесь, что передаёте корректный ID, полученный из админки WooCommerce.
- Кеширование не обновляет цены на сайте: Очистите кеш плагинов (например, WP Super Cache, W3 Total Cache) и CDN (Cloudflare и др.).
- Цены сбрасываются после обновления товара: Возможно, есть другие хуки или плагин, который перезаписывает цены. Проверьте конфликтующие плагины.
Практические советы по безопасности и производительности
- Не задавайте слишком частое обновление цен через WP-Cron, чтобы не перегружать сервер.
- Проверяйте права на запись в базу данных и используйте функции WooCommerce для изменения цен, чтобы избежать повреждения данных.
- При большом каталоге товаров используйте пакетное обновление через WP CLI или отдельные задачи с ограничением количества товаров на один запрос.
- Резервируйте базу данных перед массовыми изменениями цен.
Сравнение способов автоматического изменения цен в WooCommerce
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron с кастомным кодом | Гибкость, нет лишних плагинов | Зависит от работы WP-Cron, требует навыков | Этот пример в статье |
| Плагины акций и скидок | Удобно, готовые интерфейсы | Может замедлить сайт, ограниченная кастомизация | WooCommerce Dynamic Pricing |
| Внешние скрипты + WP CLI | Подходит для больших каталогов | Нужен доступ к серверу и навыки работы с CLI | Скрипты на PHP + cron сервера |