Диагностика задачи: почему нужно менять цены по расписанию в WooCommerce
В интернет-магазинах часто возникает необходимость автоматизировать изменение цен на товары, например, в периоды акций, сезонных скидок или для динамического ценообразования. Особенно это актуально, если у товара есть вариации с разными ценами. Ручное изменение цен неудобно и ошибочно, а сторонние плагины могут быть избыточными и дорогостоящими.
Как автоматически изменять цены в WooCommerce по расписанию
Общий подход и используемые хуки
Для реализации автоматического изменения цены по времени в WooCommerce можно использовать WP-Cron — встроенную систему планирования задач в WordPress. Скрипт будет запускаться по расписанию и обновлять цены товаров и их вариаций, учитывая заданные правила.
Основные шаги:
- Создать пользовательское расписание для WP-Cron, если требуется нестандартный интервал;
- Зарегистрировать событие cron, которое будет запускать функцию обновления цен;
- В функции обновления пройти по необходимым товарам и вариациям, изменить цену и сохранить изменения;
- Проверить результат и очистить кэш, если он используется.
Пример кода для создания расписания и обновления цен
<?php
// Добавляем новое расписание в WP-Cron
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['every_6_hours'])) {
$schedules['every_6_hours'] = [
'interval' => 21600, // 6 часов в секундах
'display' => __('Каждые 6 часов')
];
}
return $schedules;
});
// Регистрируем событие при активации темы или плагина
function wcm_schedule_price_update() {
if (!wp_next_scheduled('wcm_update_prices_event')) {
wp_schedule_event(time(), 'every_6_hours', 'wcm_update_prices_event');
}
}
register_activation_hook(__FILE__, 'wcm_schedule_price_update');
// Отписываем событие при деактивации
function wcm_clear_schedule() {
wp_clear_scheduled_hook('wcm_update_prices_event');
}
register_deactivation_hook(__FILE__, 'wcm_clear_schedule');
// Функция обновления цен
add_action('wcm_update_prices_event', function() {
$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% на все товары
if ($product->is_type('variable')) {
// Для вариаций
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if (!$variation) continue;
$regular_price = $variation->get_regular_price();
if ($regular_price) {
$new_price = round($regular_price * 0.9, 2);
$variation->set_sale_price($new_price);
$variation->save();
}
}
} else {
// Для простых товаров
$regular_price = $product->get_regular_price();
if ($regular_price) {
$new_price = round($regular_price * 0.9, 2);
$product->set_sale_price($new_price);
$product->save();
}
}
}
});
?>Пошаговое внедрение решения в существующий магазин
- Добавьте приведённый код в файл functions.php вашей дочерней темы или создайте небольшой плагин.
- Активируйте плагин или тему, чтобы запустить регистрацию cron-задачи.
- Проверьте, что в базе появились записи о запланированных задачах (например, с помощью плагина WP Crontrol).
- При необходимости измените интервал расписания или логику расчёта цены.
- Убедитесь, что цены на сайте обновляются автоматически после срабатывания cron.
Как проверить, что автоматическое обновление цен работает
- Установите плагин WP Crontrol для просмотра и управления cron-задачами (https://ru.wordpress.org/plugins/wp-crontrol/).
- В разделе «Cron Events» найдите событие
wcm_update_prices_eventи запустите его вручную. - Проверьте в админке WooCommerce, что у товаров (особенно вариаций) появились новые цены со скидкой (sale_price).
- Очистите кэш сайта и браузера, чтобы увидеть изменения на фронтенде.
- Проверьте логи сервера на ошибки, если цены не меняются.
Частые ошибки и способы их исправления
- Задача cron не запускается: Проверьте, что WP-Cron не отключен в wp-config.php (константа DISABLE_WP_CRON не должна быть true). Если используется системный cron, убедитесь в правильности настроек.
- Цены не обновляются: Убедитесь, что у товаров корректно заполнено поле regular_price. Функция
set_sale_priceменяет только цену со скидкой, а не основную. - Изменения не видны на сайте: Проверьте, не мешает ли кэширование (плагины кеша, серверный кэш). Очистите кэш.
- Ошибки PHP при сохранении товара: Проверяйте логи ошибок. Возможно, конфликт с другими плагинами или темы.
Практические советы по безопасности и производительности
- Не запускайте обновление цен слишком часто, чтобы избежать нагрузки на базу данных.
- Для крупных магазинов с тысячами товаров лучше реализовать постраничную обработку с сохранением прогресса в опциях.
- Всегда делайте резервную копию базы перед изменениями массовых данных.
- Используйте транзакции или проверяйте валидность данных перед сохранением, чтобы избежать повреждения данных.
- Если вы используете кеширование (например, Object Cache или плагин кеширования), после обновления цен сбрасывайте соответствующий кеш.
Сравнение подходов к автоматическому изменению цены
| Метод | Код | Плагин | Плюсы | Минусы |
|---|---|---|---|---|
| WP-Cron + пользовательский код | Да (как в примере) | Нет | Полный контроль, бесплатно, легко адаптируемо | Требует навыков, возможны ошибки при большом каталоге |
| Плагины динамического ценообразования | Нет | Да (например, WooCommerce Dynamic Pricing) | Удобный интерфейс, много функций | Платно, может быть тяжеловесным |
| Ручное обновление через админку | Нет | Нет | Простота | Трудозатратно, ошибки, не автоматично |