Диагностика задачи: зачем автоматизировать изменение цен в WooCommerce
В крупных интернет-магазинах на WooCommerce часто возникает необходимость массово изменять цены товаров во время акций, распродаж или специальных предложений. Ручное обновление цен занимает много времени и подвержено ошибкам. Автоматизация через хуки WooCommerce позволяет динамически изменять цену без прямого редактирования базы данных и с сохранением совместимости с другими плагинами и функционалом.
Как работает изменение цены через хуки WooCommerce
Основной механизм — фильтр woocommerce_get_price (и его вариации для разных цен: обычная, со скидкой, оптовая и т.д.). Подменяя возвращаемое значение, можно динамически менять цену товара до вывода на страницу и в корзину.
Какие хуки использовать для изменения цены
woocommerce_get_price— возвращает основную цену товара.woocommerce_product_get_price— более новый фильтр с объектом продукта.woocommerce_product_get_regular_price— для изменения регулярной цены.woocommerce_product_get_sale_price— для цены со скидкой.
Пошаговое решение: пример автоматического снижения цены на 20% при активной акции
Предположим, что акция активируется через опцию в настройках или флаг в базе, либо по дате. В примере ниже — простая проверка даты.
add_filter('woocommerce_product_get_price', 'custom_discounted_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_discounted_price', 10, 2);
function custom_discounted_price($price, $product) {
$current_date = current_time('Y-m-d');
$sale_start = '2024-06-01';
$sale_end = '2024-06-10';
// Проверяем, что сегодня в период акции
if ($current_date >= $sale_start && $current_date <= $sale_end) {
// Применяем скидку 20%
$new_price = $price * 0.8;
// Возвращаем цену с округлением до 2 знаков
return round($new_price, 2);
}
return $price;
}
Этот код динамически снижает цену товара на 20% в указанный период, не изменяя данные в базе.
Проверка результата после внедрения
- Откройте страницу товара в указанном периоде акции — цена должна отображаться со скидкой 20%.
- Добавьте товар в корзину — в корзине и на странице оплаты цена должна соответствовать новой.
- Выйдите из периода акции — цена должна вернуться к оригинальной.
- Проверьте совместимость с кешем сайта и плагинами кэширования, чтобы изменения отобразились сразу.
Частые ошибки и как их исправить
- Цена не меняется: возможно, используется кэширование или другой фильтр переопределяет цену. Отключите кеширование и проверьте приоритет фильтра (поставьте 99).
- Цены изменились, но не в корзине: WooCommerce может использовать другие хуки для корзины, например,
woocommerce_cart_item_price. Необходимо синхронизировать все фильтры. - Ошибка с типом данных цены: всегда возвращайте число с плавающей точкой или строку с числом, чтобы избежать ошибок форматирования.
- Конфликты с плагинами скидок: применяйте фильтр аккуратно и тестируйте совместимость.
Оптимизация и безопасность
- Используйте регулярные проверки даты и условий акции, чтобы не замедлять сайт лишними запросами.
- Не меняйте цену в базе данных напрямую — это может привести к рассинхронизации данных и проблемам с отчетами.
- Для более сложных акций используйте кастомные поля товаров или опции, а не хардкод даты.
Дополнительный пример: применение скидки только на определённую категорию товаров
add_filter('woocommerce_product_get_price', 'category_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'category_discount_price', 10, 2);
function category_discount_price($price, $product) {
if (has_term('sale-category', 'product_cat', $product->get_id())) {
return round($price * 0.9, 2); // скидка 10% для категории
}
return $price;
}
Такой подход позволяет гибко управлять скидками по категориям без изменения базы.
Таблица сравнения способов изменения цены
| Метод | Преимущества | Недостатки | Применение |
|---|---|---|---|
| Фильтры WooCommerce (как в примерах) | Динамическое изменение, не меняет базу, совместимость | Могут быть проблемы с кешем, требует полного охвата хуков | Акции, временные скидки, маркетинговые кампании |
| Изменение цены в базе (update_post_meta) | Постоянное изменение, работает сразу везде | Риск рассинхронизации данных, сложно откатить | Постоянные скидки или исправления |
| Плагины скидок WooCommerce | Готовое решение, настройки через UI | Может быть тяжеловесным, не всегда гибко | Сложные акции без кода |