Диагностика задачи: зачем менять цены программно в WooCommerce?
В интернет-магазинах на WooCommerce часто возникает задача менять цены товаров автоматически в зависимости от определённых условий: акции, количество товара в корзине, роль пользователя, дата и время, наличие определённых товаров и т.д. Ручное обновление цен неудобно и подвержено ошибкам, особенно при большом ассортименте. В статье рассмотрим, как реализовать такие изменения через код, без сторонних плагинов.
Как определить условия для изменения цены
Первым делом необходимо четко определить, при каких условиях цена должна изменяться. Примеры условий:
- Цена снижается на 10% для пользователей с ролью «оптовик»
- Цена товара снижается, если в корзине более 5 единиц товара
- Цена повышается на 15% в праздничные дни
- Цена фиксируется на определённом уровне, если товар относится к конкретой категории
Четкое понимание условий поможет правильно настроить фильтры WooCommerce.
Пошаговое решение: изменение цены с помощью фильтра woocommerce_product_get_price
Для динамического изменения цены в WooCommerce используют фильтр woocommerce_product_get_price и похожие _get_regular_price, _get_sale_price. Ниже пример кода, который снижает цену на 10% для пользователей с ролью «wholesaler» (оптовик):
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 (is_admin()) return $price; // не трогаем админку
$user = wp_get_current_user();
if (in_array('wholesaler', (array) $user->roles)) {
$discount = 0.9; // 10% скидка
$price = $price * $discount;
}
return $price;
}Разместите этот код в файле functions.php вашей дочерней темы или в отдельном функциональном плагине.
Как проверить, что цена изменилась
- Авторизуйтесь под пользователем с ролью
wholesaler. - Откройте страницу товара и убедитесь, что цена стала на 10% ниже.
- Выйдите из системы или смените пользователя с другой ролью — цена должна вернуться к обычной.
Изменение цены в зависимости от количества товара в корзине
Если нужно менять цену в зависимости от количества товара, фильтр woocommerce_before_calculate_totals позволяет изменить цену для каждого товара в корзине перед подсчетом суммы:
add_action('woocommerce_before_calculate_totals', 'custom_bulk_discount');
function custom_bulk_discount($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$quantity = $cart_item['quantity'];
$product = $cart_item['data'];
// Скидка 20% если куплено более 5 штук
if ($quantity > 5) {
$price = $product->get_regular_price() * 0.8;
$product->set_price($price);
}
}
}Этот код уменьшит цену на 20% для товаров с количеством свыше 5 в корзине.
Проверка результата
- Добавьте в корзину более 5 единиц одного товара.
- Перейдите в корзину — цена должна отображаться с 20% скидкой.
- Уменьшите количество до 5 и ниже — цена должна вернуться к обычной.
Сравнение подходов: фильтры цен vs плагины
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код через фильтры WooCommerce | Гибкость, контроль, нет дополнительной нагрузки | Требует навыков PHP, сложно для нестандартных условий | Пример с woocommerce_product_get_price |
| Плагины скидок и динамических цен | Удобный интерфейс, много готовых условий | Могут замедлять сайт, не всегда бесплатны | WooCommerce Dynamic Pricing, Discount Rules |
Частые ошибки при программном изменении цены и как их исправить
- Цена не меняется в админке или на странице товара: фильтр применяется, но админка не изменяет цену. Это нормально, добавьте проверку
if (is_admin()) return $price;. - Цена меняется, но не отображается в корзине: Используйте
woocommerce_before_calculate_totalsдля корректного изменения цены в корзине и на кассе. - Кэширование мешает отображению новой цены: Отключите кэширование для корзины и страниц с ценами, или очистите кэш после изменений.
- Ошибки при вычислении цены из-за неправильных типов данных: Приводите цену к числу через
floatval()перед расчетами.
Практические советы по безопасности и производительности
- Избегайте излишних вычислений в хукe изменения цены — кешируйте результаты, если нужно.
- Не используйте глобальные запросы в фильтрах цены, чтобы не замедлять загрузку страниц.
- Проверяйте роль пользователя с помощью
wp_get_current_user(), а не глобальных переменных. - При изменении цен учитывайте мультивалютность и другие расширения WooCommerce.
- Тестируйте изменения на тестовом сайте, чтобы избежать сбоев в работе магазина.