Диагностика задачи: зачем менять цену товара динамически в WooCommerce
Иногда нужно изменить цену товара не напрямую в базе, а динамически на этапе вывода — например, для проведения специальных скидок, учета индивидуальных условий клиента или интеграции с внешними системами. В WooCommerce для этого используются фильтры, которые позволяют корректировать цену до отображения на сайте и в корзине без изменения основной цены в базе.
Как изменить цену товара на лету: пошаговое решение
Использование фильтра woocommerce_product_get_price
Фильтр woocommerce_product_get_price позволяет изменить цену товара при ее получении. Ниже пример кода, который добавляет 10% скидку для пользователя с ролью "wholesale_customer":
add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
if (current_user_can('wholesale_customer')) {
$discount = 0.9; // 10% скидка
$price = $price * $discount;
}
return $price;
}Обработка цены в корзине и оформлении заказа
Чтобы цена изменилась и в корзине, и при оформлении заказа, нужно аналогично применить фильтр woocommerce_product_get_price и woocommerce_product_get_regular_price (если нужно менять и обычную цену), а также woocommerce_cart_item_price для корректного отображения в корзине.
add_filter('woocommerce_cart_item_price', 'custom_cart_item_price', 10, 3);
function custom_cart_item_price($price_html, $cart_item, $cart_item_key) {
if (current_user_can('wholesale_customer')) {
$product = $cart_item['data'];
$price = $product->get_price();
$price_html = wc_price($price);
}
return $price_html;
}Проверка результата после внедрения
- Авторизуйтесь под пользователем с ролью
wholesale_customerи откройте страницу товара — цена должна быть ниже на 10%. - Добавьте товар в корзину и проверьте, что цена там совпадает с измененной.
- Оформите заказ и убедитесь, что итоговая сумма соответствует динамической цене.
Частые ошибки и как их исправить
- Изменение цены только на странице товара, но не в корзине: нужно использовать фильтры, которые применяются и в корзине, например
woocommerce_cart_item_price. - Цена меняется для всех пользователей: проверьте в коде условие с
current_user_can()или аналогичной логикой, фильтр должен применяться только для нужных ролей или условий. - Цена меняется, но не сохраняется при оформлении заказа: динамическая цена не изменяет данные в заказе, чтобы сохранить цену, можно использовать фильтры
woocommerce_before_calculate_totalsдля корректировки цены в объекте корзины.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы к базе или внешним API внутри фильтров цены — это замедлит загрузку страниц.
- Кэшируйте результаты расчетов, если применяете сложные условия.
- Тестируйте все изменения на staging-сайте, чтобы избежать ошибок в процессе оформления заказа.
Сравнение способов изменения цены на лету
| Способ | Преимущества | Недостатки |
|---|---|---|
Фильтры WooCommerce (woocommerce_product_get_price) | Гибкость, не изменяет базу, легко отменяется | Требует точной настройки, может не работать в сторонних плагинах |
| Изменение цены в базе данных | Постоянное изменение, учитывается везде | Риск ошибок, сложно откатить изменения |
| Плагины для динамических цен | Удобство, готовые решения | Зависимость от стороннего кода, нагрузка |