Диагностика проблемы: почему цены не обновляются автоматически при скидках
Часто в WooCommerce требуется автоматически менять цену товара при наличии акции, чтобы избежать ручного обновления цен. Если вы столкнулись с тем, что цены не меняются по запланированному условию, проверьте следующие моменты:
- Акционные цены заданы в поле
sale_priceтовара, а не просто в описании. - Нет конфликтов с другими плагинами, которые могут перезаписывать цены.
- Кэш сайта и браузера очищен — иногда старый кэш показывает устаревшую цену.
- Правильно настроены даты начала и окончания акции (поля
date_on_sale_fromиdate_on_sale_to).
Пошаговое решение: как автоматизировать обновление цены товара при акции
1. Использование хука для программного обновления цен
Чтобы автоматически менять цену товара при заданном условии, используйте хук save_post или крон-задачи. Ниже пример кода, который устанавливает скидку 20% для всех товаров из определённой категории "sale":
function update_sale_price_for_category() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'sale',
),
),
);
$products = get_posts($args);
foreach ($products as $product_post) {
$product = wc_get_product($product_post->ID);
$regular_price = floatval($product->get_regular_price());
if ($regular_price > 0) {
$sale_price = round($regular_price * 0.8, 2); // скидка 20%
$product->set_sale_price($sale_price);
$product->save();
}
}
}
// Запускайте функцию вручную или привяжите к крону
// update_sale_price_for_category();
2. Автоматизация с помощью WP-Cron
Для автоматического применения скидок ежедневно добавьте задачу в WP-Cron:
add_action('wp', function() {
if (!wp_next_scheduled('daily_update_sale_prices')) {
wp_schedule_event(time(), 'daily', 'daily_update_sale_prices');
}
});
add_action('daily_update_sale_prices', 'update_sale_price_for_category');
Проверка результата после внедрения
- Откройте товар из категории "sale" в админке и проверьте, что поле
Sale priceзаполнено с учётом скидки. - На фронтенде очистите кэш и обновите страницу товара — цена должна измениться согласно скидке.
- Проверьте логи ошибок PHP, если цены не обновляются.
Частые ошибки и их исправление
- Цена не обновляется — проверьте, активна ли функция, и нет ли ограничений на запись товара. Иногда требуется отключить кэширование при тестах.
- Скидка не применяется — убедитесь, что выбранная категория товаров указана правильно, и что в базе нет конфликта с другими плагинами, которые могут менять цену.
- Крон не запускается — для проверки WP-Cron используйте плагин WP Crontrol, убедитесь, что задачи запланированы.
- Кэширование — если используется плагин кеширования, отключите его временно, чтобы увидеть изменения.
Практические советы по безопасности и производительности
- Не запускайте функцию обновления цен на каждом запросе — используйте WP-Cron или админские действия.
- Для больших магазинов делайте обновление партиями, чтобы избежать таймаутов сервера.
- Добавляйте проверки и логирование для отладки — например, записывайте IDs обновлённых товаров в лог.
- Очищайте кэш WooCommerce после обновления цен программно:
function clear_wc_cache_after_price_update() {
wc_delete_product_transients();
}
add_action('update_postmeta', 'clear_wc_cache_after_price_update');
Сравнение вариантов реализации автоматического обновления цен
| Способ | Преимущества | Недостатки |
|---|---|---|
| Ручное обновление | Простота, полный контроль | Трудозатратно, риск ошибок |
| WP-Cron с кастомным скриптом | Автоматизация, гибкость | Зависимость от запуска WP-Cron, нагрузка при большом количестве товаров |
| Плагины скидок | Готовые решения, удобство | Могут влиять на производительность, лишние зависимости |