Диагностика задачи: зачем автоматизировать изменение цен в WooCommerce
В интернет-магазинах часто возникает необходимость менять цены на товары в определённые даты, например, на распродажи, праздники или сезонные акции. Вручную корректировать цены неудобно и рискованно — можно забыть, пропустить сроки или допустить ошибку. Автоматизация изменения цен по расписанию решает эти задачи, обеспечивая своевременное и точное обновление цен.
Как работает автоматическое изменение цен в WooCommerce
Идея решения — использовать WP-Cron для запуска функции изменения цен в заданное время. Функция выбирает нужные товары и обновляет их цены программно.
Основные этапы:
- Создание функции, которая изменяет цены товаров.
- Регистрация WP-Cron задачи на нужный интервал (например, ежедневно в полночь).
- Проверка и удаление задачи при деактивации темы или плагина.
Пошаговое решение с примером кода
1. Функция для обновления цен
В примере ниже мы увеличим цену всех товаров из категории «sale-items» на 20% в период акции.
function wpfind_update_sale_prices() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'sale-items',
],
],
'post_status' => 'publish',
];
$products = get_posts($args);
foreach ($products as $product_post) {
$product = wc_get_product($product_post->ID);
if (!$product) continue;
$regular_price = $product->get_regular_price();
if (!$regular_price) continue;
// Увеличиваем цену на 20%
$new_price = round($regular_price * 1.20, 2);
$product->set_price($new_price);
$product->set_sale_price(''); // Снимаем скидку, если была
$product->save();
}
}2. Регистрация WP-Cron задачи
Добавляем задачу, которая запускается ежедневно в полночь.
function wpfind_schedule_price_update() {
if (!wp_next_scheduled('wpfind_daily_price_update')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'wpfind_daily_price_update');
}
}
add_action('wp', 'wpfind_schedule_price_update');
add_action('wpfind_daily_price_update', 'wpfind_update_sale_prices');3. Очистка при деактивации
Чтобы не создавать лишних задач, удалим cron при деактивации темы или плагина.
function wpfind_clear_scheduled_price_update() {
$timestamp = wp_next_scheduled('wpfind_daily_price_update');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpfind_daily_price_update');
}
}
register_deactivation_hook(__FILE__, 'wpfind_clear_scheduled_price_update');Проверка результата после внедрения
- Проверьте наличие запланированной задачи:
wp cron event listчерез WP-CLI или с помощью плагина WP Crontrol. - Проверьте цены товаров из категории «sale-items» до и после запуска cron (можно временно изменить расписание на ближайшую минуту для теста).
- В журнале ошибок PHP убедитесь, что нет предупреждений или ошибок.
Частые ошибки и как их исправить
- Функция не запускается: Убедитесь, что WP-Cron включён и сайт посещается регулярно, иначе задачи не срабатывают.
- Цены не изменяются: Проверьте, что у товаров есть регулярные цены и что категория указана правильно.
- Дублирование задач: Проверьте, что
wp_next_scheduledкорректно предотвращает повторное создание задачи. - Ошибка при сохранении продукта: Используйте
wc_get_productдля получения объекта и методsave()для сохранения изменений.
Практические советы по безопасности и производительности
- Не используйте сложные запросы в cron без пагинации — при большом количестве товаров нагрузка будет большой.
- Для массового обновления цен используйте WP-CLI скрипты, если cron не подходит по нагрузке.
- Поддерживайте резервное копирование базы данных перед изменениями цен.
- Для нестандартных условий акций можно расширить функцию фильтрами и параметрами, чтобы не менять цены вручную.
Сравнение вариантов автоматизации изменения цен
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с PHP кодом | Гибко, бесплатно, легко кастомизировать | Зависит от посещаемости сайта, нагрузка при большом каталоге |
| Плагины для распродаж (например, WooCommerce Scheduler) | Удобный интерфейс, дополнительные функции | Может быть платным, лишний код, возможны конфликты |
| WP-CLI скрипты | Быстрее при больших объёмах, можно запускать вручную | Требует SSH доступа и навыков работы с командной строкой |