Диагностика проблемы: как быстро и гибко менять цены по акциям в WooCommerce
В стандартном WooCommerce есть возможность устанавливать скидки через купоны или фиксированные скидки на товары. Однако, если требуется динамически менять цены по акциям с определённой логикой (например, скидка в зависимости от категории товара, времени акции или роли пользователя), встроенных средств недостаточно. Многие владельцы магазинов сталкиваются с необходимостью писать кастомные функции для автоматизации изменения цен, чтобы не менять цены вручную или не использовать громоздкие плагины.
Основные вопросы, которые возникают:
- Как добавить скидку на товар программно, чтобы она автоматически применялась на фронтенде и в корзине?
- Как учитывать разные условия акции (категории, даты, роли пользователей)?
- Как правильно применять скидку без конфликтов с другими плагинами и не ломать логику WooCommerce?
Пошаговое решение: пример кода для динамического изменения цены товара по акции
Рассмотрим пример, как программно уменьшить цену товара на 20% для товаров из категории с ID 15, если пользователь авторизован, и акция действует в определённый период.
1. Добавляем фильтр для изменения цены товара на фронтенде и в корзине
add_filter('woocommerce_product_get_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_dynamic_discount_price', 10, 2);
add_filter('woocommerce_cart_item_price', 'custom_cart_item_price', 10, 3);2. Функция для вычисления новой цены
function custom_dynamic_discount_price($price, $product) {
// Проверяем, что пользователь авторизован
if (!is_user_logged_in()) {
return $price;
}
// Проверяем дату акции
$start_date = strtotime('2024-06-01');
$end_date = strtotime('2024-06-10');
$now = current_time('timestamp');
if ($now < $start_date || $now > $end_date) {
return $price;
}
// Проверяем, что товар в нужной категории
if (has_term(15, 'product_cat', $product->get_id())) {
// Скидка 20%
$price = $price * 0.8;
}
return $price;
}
// Для корректного отображения цены в корзине
function custom_cart_item_price($price_html, $cart_item, $cart_item_key) {
$product = $cart_item['data'];
$price = $product->get_price();
return wc_price($price);
}Проверка результата после внедрения
- Авторизуйтесь на сайте под пользователем.
- Откройте страницу товара из категории с ID 15 в период акции (например, 1-10 июня 2024).
- Убедитесь, что цена товара отображается со скидкой 20%.
- Добавьте товар в корзину, проверьте, что в корзине цена также снижена.
- Если пользователь не авторизован или товар не из категории 15, цена должна оставаться без изменений.
Частые ошибки и как их исправить
- Цена не меняется в корзине или на странице товара. Проверьте, что фильтры подключены правильно. Для корзины нужно дополнительно фильтровать вывод цены через
woocommerce_cart_item_price. - Скидка применяется всегда. Проверьте условия в функции: даты, категории и авторизацию пользователя.
- Конфликты с другими плагинами скидок. Иногда другие плагины могут перезаписывать цены. Рекомендуется тестировать на чистом сайте и по возможности использовать приоритеты фильтров.
- Неправильное отображение цен в заказах и email. Для этого можно добавить аналогичные фильтры для
woocommerce_order_get_item_totalsили использовать хуки для корректного отображения.
Практические советы по производительности и безопасности
- Лучше избегать вызова тяжелых функций внутри фильтра цены — кэшируйте результаты или используйте transient для условий акции.
- Проверяйте типы данных, чтобы не вызвать ошибку при подсчёте цен (числа с плавающей точкой).
- Если акция повторяющаяся, храните даты в настройках темы или плагина, чтобы не менять код.
- Не используйте пользовательские данные без проверки (например, user roles) — применяйте встроенные функции WordPress.
Сравнение способов реализации скидок в WooCommerce
| Способ | Преимущества | Недостатки |
|---|---|---|
| Плагины скидок (например, WooCommerce Dynamic Pricing) | Готовый функционал, UI для настройки | Платные, могут нагружать сайт |
| Кодовые решения (фильтры цены) | Гибкость, точечное управление | Требует навыков, возможны ошибки |
| Использование купонов | Просто, встроено в WooCommerce | Не всегда подходит для динамических условий |