Диагностика задачи: зачем автоматизировать изменение цен в WooCommerce
В магазинах на WooCommerce часто возникает необходимость динамически менять цены товаров по определённым условиям — например, в зависимости от даты, категории, наличия скидок или количества в корзине. Ручное обновление цен неудобно и требует много времени, особенно при большом ассортименте. Автоматизация через хуки WooCommerce позволяет программно изменять цену без вмешательства администратора.
Какие хуки WooCommerce использовать для изменения цены товара
Основной хук для изменения цены перед выводом на сайте — woocommerce_product_get_price и woocommerce_product_get_regular_price. Для изменения цены в корзине и при расчёте итогов — woocommerce_before_calculate_totals.
Пример: изменим цену товара на 10% ниже, если он относится к категории «Распродажа».
add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
if (has_term('sale', 'product_cat', $product->get_id())) {
$price = $price * 0.9; // скидка 10%
}
return $price;
}Обработка цены в корзине
Важно применить изменения и в корзине, чтобы клиент видел актуальную цену. Для этого используйте хук woocommerce_before_calculate_totals и измените цену товара в объекте корзины.
add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price', 10, 1);
function custom_cart_item_price($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
foreach ($cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
if (has_term('sale', 'product_cat', $product->get_id())) {
$new_price = $product->get_price() * 0.9;
$product->set_price($new_price);
}
}
}Пошаговое решение для автоматизации изменения цен
- Определите условие изменения цены (категория, дата, атрибут).
- Добавьте фильтры
woocommerce_product_get_priceиwoocommerce_product_get_regular_priceдля фронтенда. - Добавьте обработчик
woocommerce_before_calculate_totalsдля изменения цены в корзине. - Тестируйте на тестовом сайте, чтобы не ломать продажи.
- Оптимизируйте код, избегая лишних запросов.
Проверка результата после внедрения
- Откройте товар на сайте, относящийся к нужной категории, и проверьте цену — должна измениться согласно логике.
- Добавьте этот товар в корзину и убедитесь, что итоговая цена в корзине и на странице оформления заказа соответствует изменённой цене.
- Проверьте, что для товаров вне условия цена не меняется.
- Проверьте работу с кэшированием, отключите кэш на время теста.
Частые ошибки и как их исправить
- Изменения не отображаются в корзине: забыли использовать
woocommerce_before_calculate_totalsдля обновления цен в корзине. - Цена меняется в админке: добавьте проверку
if (is_admin() && !defined('DOING_AJAX')) return;в обработчике, чтобы не ломать административную панель. - Конфликты с плагинами кэширования: отключите кэширование страниц с корзиной и товаром или настройте исключения.
- Скидка применяется ко всем товарам: проверьте правильность условия
has_term()и ID категории.
Практические советы для безопасности и производительности
- Используйте кеширование результатов проверки условий (например, категорий) для уменьшения нагрузки.
- Не вызывайте дорогостоящие функции внутри цикла по корзине.
- Тестируйте изменения в staging-среде перед продакшеном.
- Используйте дочернюю тему или собственный плагин для добавления кода, чтобы не потерять изменения при обновлении.
Сравнение способов автоматизации изменения цен
| Метод | Преимущества | Недостатки |
|---|---|---|
| Добавление кода в functions.php | Быстро, гибко, бесплатно | Риск потерять при обновлении темы, требует навыков PHP |
| Использование плагинов для динамических цен | Готовые решения с интерфейсом, меньше кода | Может быть платным, нагрузка на сайт |
| Изменение цен через SQL-запросы | Массовое обновление | Риск ошибок, не динамично |