В чём суть задачи: зачем менять цены автоматически
В интернет-магазинах на WooCommerce часто возникает необходимость обновлять цены товаров по расписанию — например, для сезонных скидок, акций или динамического ценообразования. Делать это вручную неудобно и чревато ошибками, особенно если товаров много.
В этой статье разберём, как реализовать автоматическое изменение стоимости товаров с помощью WP-Cron и стандартных функций WooCommerce без сторонних плагинов.
Диагностика проблемы: почему стандартный WooCommerce не подходит для расписаний
WooCommerce не имеет встроенного механизма для изменения цен по расписанию. Встроенные скидки и акции можно задавать вручную через купоны или акции, но они не масштабируются и не позволяют гибко менять цены без вмешательства администратора.
Решения через сторонние плагины часто увеличивают нагрузку на сайт и требуют дополнительного обслуживания. Автоматизация через WP-Cron и пользовательский код — более лёгкий и контролируемый вариант.
Пошаговое решение: как настроить автоматическое изменение цен по расписанию
1. Создаём функцию изменения цены товара
Для начала напишем функцию, которая будет менять цену товара по ID и новой цене.
function wpb_update_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(''); // очистить скидку, если была
$product->save();
return true;
}2. Создаём функцию для массового обновления цен по условию
Например, снизим цены всех товаров из определённой категории на 10%.
function wpb_bulk_update_prices() {
$args = [
'status' => 'publish',
'limit' => -1,
'category' => ['sale-products'], // slug категории
];
$products = wc_get_products($args);
foreach ($products as $product) {
$current_price = $product->get_regular_price();
if ($current_price > 0) {
$new_price = round($current_price * 0.9, 2); // скидка 10%
wpb_update_product_price($product->get_id(), $new_price);
}
}
}3. Регистрируем WP-Cron событие для периодического запуска
Добавим событие, которое будет запускать функцию обновления цен, например, ежедневно в 2 часа ночи.
add_action('wp', function() {
if (!wp_next_scheduled('wpb_daily_price_update')) {
wp_schedule_event(strtotime('02:00:00'), 'daily', 'wpb_daily_price_update');
}
});
add_action('wpb_daily_price_update', 'wpb_bulk_update_prices');4. Добавляем возможности ручного запуска для отладки
Для проверки можно добавить вызов функции по URL с проверкой прав администратора.
add_action('admin_post_wpb_run_price_update', function() {
if (!current_user_can('manage_woocommerce')) {
wp_die('Нет доступа');
}
wpb_bulk_update_prices();
wp_redirect(admin_url());
exit;
});Проверка результата после внедрения
- Проверьте, что в
wp_optionsпоявилась запись с расписаниемwpb_daily_price_update(через phpMyAdmin или WP CLI). - Запустите функцию вручную через URL
https://ваш-сайт/wp-admin/admin-post.php?action=wpb_run_price_updateпод аккаунтом администратора и убедитесь, что цены обновились. - Проверьте в админке WooCommerce цены товаров из нужной категории — они должны быть снижены на 10%.
- Убедитесь, что после запуска WP-Cron в 2 часа ночи цены обновятся автоматически (можно проверить логи или добавить временный лог в функцию).
Частые ошибки и как их исправить
- WP-Cron не срабатывает: на некоторых хостингах WP-Cron отключён или срабатывает только при посещении сайта. Проверьте
DISABLE_WP_CRONвwp-config.php. Для надёжной работы настройте системный cron на сервере или используйте плагин WP Crontrol. - Функция не обновляет цены: убедитесь, что ID продуктов правильные и товары опубликованы. Проверяйте ошибки в логах PHP.
- Цена не отображается правильно в корзине: после обновления цены очистите кэш WooCommerce и браузера, обновите сессии покупателей.
- Изменения перезаписываются вручную: если администратор меняет цены вручную, автоматизация перезапишет их при следующем запуске. Подумайте о логике приоритетов.
Практические советы по безопасности и производительности
- Ограничьте область действия массового обновления — например, только определённые категории или товары с определённым флагом.
- Добавьте логирование выполнения для отслеживания ошибок и успешных обновлений.
- При большом количестве товаров делайте обновление партиями (например, по 50 товаров за один запуск), чтобы избежать таймаутов.
- Проверяйте права пользователя при ручном запуске, чтобы исключить несанкционированные изменения.
- Используйте transient API для кеширования результатов, если нужно отображать информацию о скидках на фронтенде.
Таблица сравнения вариантов автоматизации изменения цен
| Метод | Преимущества | Недостатки |
|---|---|---|
| Сторонние плагины (например, Dynamic Pricing) | Готовые функции, удобный интерфейс, поддержка акций и условий | Нагрузка на сайт, стоимость, ограниченная кастомизация |
| Код с WP-Cron (как в статье) | Полный контроль, лёгкий вес, бесплатное решение | Требует навыков разработки, риски при ошибках, ограниченный UI |
| Ручное обновление цен | Простота, мгновенный контроль | Большая вероятность ошибок, утомительно при большом ассортименте |