Проблема: необходимость периодического изменения цен в WooCommerce
В интернет-магазинах на WooCommerce часто возникает задача автоматически менять цены товаров по расписанию — например, для сезонных скидок, акций или динамического прайсинга. Встроенных средств для этого нет, а ручное изменение цен неудобно и приводит к ошибкам.
Диагностика задачи: что нужно учесть
- Какие товары должны изменяться: все, категории, отдельные товары или по мета-данным.
- Тип изменения: фиксированная скидка, процент, установка новой цены.
- Периодичность: ежедневное, еженедельное, однократное изменение.
- Влияние на кэш и индексацию.
- Необходимость отката цен после акции.
Пошаговое решение: реализация автоматического изменения цен с помощью WP-Cron и хуков WooCommerce
1. Создание функции для изменения цены товара
Для примера реализуем изменение цены всех товаров определённой категории, уменьшая цену на 10%.
function wpassist_change_product_prices() {
$args = [
'status' => 'publish',
'limit' => -1,
'category' => ['sale-category'], // укажите slug категории
];
$products = wc_get_products($args);
foreach ($products as $product) {
$regular_price = $product->get_regular_price();
if (!$regular_price) continue;
$new_price = $regular_price * 0.9; // скидка 10%
$product->set_sale_price($new_price);
$product->save();
}
}2. Регистрация события WP-Cron для запуска по расписанию
Добавим еженедельное событие, запускающее функцию изменения цен.
function wpassist_schedule_price_update() {
if (!wp_next_scheduled('wpassist_update_prices_event')) {
wp_schedule_event(time(), 'weekly', 'wpassist_update_prices_event');
}
}
add_action('wp', 'wpassist_schedule_price_update');
add_action('wpassist_update_prices_event', 'wpassist_change_product_prices');3. Добавление отмены акции (сброс цен) по аналогии
Для возврата цен к обычным можно сделать отдельную функцию и событие, которые убирают акционные цены.
function wpassist_reset_product_prices() {
$args = [
'status' => 'publish',
'limit' => -1,
'category' => ['sale-category'],
];
$products = wc_get_products($args);
foreach ($products as $product) {
$product->set_sale_price('');
$product->save();
}
}
// Аналогично можно добавить wp_schedule_event для отмены по расписаниюПроверка результата
- Перейдите в админку WooCommerce, откройте список товаров категории "sale-category" и убедитесь, что у них появилась скидочная цена (sale price) с уменьшенной на 10% стоимостью.
- Проверьте фронтенд — цена товара должна отображаться с учётом скидки.
- Для проверки работы WP-Cron можно использовать плагин WP Crontrol или запустить событие вручную с помощью
do_action('wpassist_update_prices_event');.
Частые ошибки и способы их устранения
- WP-Cron не запускается: на некоторых хостингах требуется настроить системный cron или использовать плагин для имитации запуска.
- Неверно указана категория: убедитесь, что slug категории указан правильно в параметре
'category'. - Цена не меняется: проверьте, что у товаров задана регулярная цена, и что метод
save()вызывается после изменения. - Проблемы с кэшированием: после изменения цен очистите кеш страниц и объектный кеш, если используется (Redis, Memcached).
Практические советы по безопасности и производительности
- Не выполняйте массовое обновление цен на страницах с высокой нагрузкой — используйте WP-Cron или CLI.
- Добавьте проверку nonce и прав пользователя, если запускаете изменение из админки.
- Оптимизируйте выборку продуктов для ускорения работы — избегайте выборки слишком большого количества товаров за раз.
- Для больших магазинов используйте пакетную обработку (batch processing), чтобы избежать таймаутов.
Сравнение вариантов реализации автоматического изменения цен
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron + PHP код | Гибкость, нет зависимости от плагинов, можно полностью контролировать логику | Зависит от корректной работы WP-Cron, возможны таймауты при большом объёме |
| Плагины скидок и акций | Удобный интерфейс, готовые функции, поддержка от разработчиков | Может быть тяжеловесным, не всегда гибко настраивается под сложные задачи |
| Внешние скрипты и CLI | Производительность, надежность, можно запускать по cron напрямую | Требует доступа к серверу, навыков CLI, сложнее интегрировать с UI |