В чём суть задачи: зачем менять цену автоматически
В WooCommerce часто требуется динамически изменять цену товаров в зависимости от различных условий: например, скидка при покупке определённого количества, изменение цены для определённой роли пользователя, или корректировка цен в зависимости от даты или региона. Стандартных функций в WooCommerce для гибкой настройки таких сценариев недостаточно, поэтому нужно внедрять кастомный код.
Диагностика проблемы: почему стандартные скидки не всегда подходят
Многие пытаются использовать купоны или стандартные скидки в WooCommerce, но они не всегда решают задачи, когда цена должна изменяться без участия пользователя, или когда условия сложные и зависят от нескольких факторов. Например:
- Скидка только для зарегистрированных пользователей с ролью «оптовик»
- Изменение цены в зависимости от количества товаров в корзине
- Автоматическое повышение цены на определённые товары в праздничные дни
Если попытаться сделать это через купоны — получится неудобно и неавтоматично. Потребуется программное вмешательство.
Пошаговое решение: как программно изменять цены с помощью хуков WooCommerce
Используем хук woocommerce_get_price
Этот фильтр позволяет изменить цену товара на лету. Его можно использовать для любых сценариев.
add_filter('woocommerce_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
// Пример: скидка 10% для пользователей с ролью оптовик
if (is_user_logged_in()) {
$user = wp_get_current_user();
if (in_array('wholesaler', (array) $user->roles)) {
$price = $price * 0.9; // скидка 10%
}
}
return $price;
}Изменение цены в зависимости от количества в корзине
Иногда нужно изменять цену товара, если в корзине больше определённого количества товара. Для этого дополнительно получаем данные о корзине.
add_filter('woocommerce_get_price', 'custom_price_based_on_cart_quantity', 10, 2);
function custom_price_based_on_cart_quantity($price, $product) {
if (is_admin()) return $price; // не меняем цену в админке
$target_product_id = 123; // ID товара для изменения цены
$threshold = 5; // минимальное количество для скидки
$cart_quantity = 0;
foreach (WC()->cart->get_cart() as $cart_item) {
if ($cart_item['product_id'] == $target_product_id) {
$cart_quantity += $cart_item['quantity'];
}
}
if ($product->get_id() == $target_product_id && $cart_quantity >= $threshold) {
$price = $price * 0.85; // скидка 15%
}
return $price;
}Проверка результата после внедрения
Для проверки изменений цены:
- Очистите кэш сайта и браузера (особенно если используете кеширующие плагины)
- Авторизуйтесь под пользователем с нужной ролью (если условие на роль)
- Добавьте в корзину товар, на который влияет изменение цены
- Убедитесь, что на странице товара и в корзине отображается изменённая цена
- Проверьте, что в админке цена товара осталась без изменений (изменения только на фронтенде)
Частые ошибки и как их исправить
- Цена не меняется на странице товара или в корзине: проверьте, что хук
woocommerce_get_priceдействительно срабатывает, и что код подключён правильно в functions.php или в плагине. Также убедитесь, что нет конфликтов с другими плагинами, которые могут перезаписывать цену. - Изменения цены влияют на админку: всегда добавляйте проверку
is_admin()и возвращайте оригинальную цену в админке, иначе могут возникнуть проблемы с учётом и отчетностью. - Ошибка при обращении к корзине на странице товара: WC()->cart доступна только после инициализации WooCommerce и только на фронтенде, поэтому используйте проверку
if (WC()->cart)и не вызывайте код в админке. - Изменённая цена не учитывается в заказах: при использовании фильтра
woocommerce_get_priceубедитесь, что WooCommerce пересчитывает стоимость в корзине и при оформлении заказа. Иногда потребуется дополнительно фильтроватьwoocommerce_product_get_priceиwoocommerce_product_variation_get_price.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы к базе в функциях изменения цены, чтобы не замедлять загрузку страниц.
- Всегда кешируйте результаты вычислений внутри функции, если условия сложные.
- Проверяйте права пользователя через стандартные функции WordPress, не пишите собственные обходы.
- Тестируйте код на тестовой среде перед выкатыванием на продакшн.
Сравнение подходов: плагин vs кастомный код
| Подход | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Плагины для динамических цен (например, WooCommerce Dynamic Pricing) | Готовые интерфейсы, простая настройка без кода | Могут быть тяжеловесными, ограничены в кастомизации, платные | Использовать при простых задачах и отсутствии навыков программирования |
| Кастомный код (хуки WooCommerce) | Максимальная гибкость, лёгкий и быстрый код, полностью под себя | Требует знаний PHP и WooCommerce API, возможны ошибки | Рекомендуется для разработчиков и при нестандартных сценариях |