Диагностика задачи: почему нужно автоматически изменять цену товаров при акциях
Во многих интернет-магазинах на WooCommerce возникает необходимость динамически менять цену товара при проведении акций — например, временно снижать цену на 10% или устанавливать фиксированную скидку для определённых категорий товаров. Делать это вручную неудобно и рискованно, особенно если товаров много и акции разные. Автоматизация через функции и хуки WooCommerce позволяет задать правила изменения цены без ручного вмешательства.
Как работает изменение цены в WooCommerce: ключевые хуки и методы
Изменить цену товара на лету можно с помощью фильтра woocommerce_product_get_price и woocommerce_product_get_regular_price. Эти фильтры позволяют возвращать изменённую цену в зависимости от условий.
Пример базового фильтра, который снижает цену на 10% у всех товаров:
add_filter('woocommerce_product_get_price', 'custom_sale_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_sale_price', 10, 2);
function custom_sale_price($price, $product) {
// Проверка, что цена есть и товар опубликован
if (!$product->is_on_sale() && $price > 0) {
$discount = 0.10; // 10% скидка
$price = $price * (1 - $discount);
}
return $price;
}Однако такой подход прост и не учитывает даты акции, категории или пользовательские роли. Чтобы сделать гибко — добавим дополнительные проверки.
Пошаговое решение: динамическая скидка на товары категории «Распродажа» с датами акции
1. Создайте категорию товаров для акции
В админке WooCommerce создайте категорию с названием, например, sale. Все товары, на которые будет распространяться скидка, добавьте в эту категорию.
2. Добавьте функцию с проверкой даты и категории
add_filter('woocommerce_product_get_price', 'dynamic_sale_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'dynamic_sale_price', 10, 2);
function dynamic_sale_price($price, $product) {
if (!$price || $price == 0) return $price;
$current_date = current_time('Y-m-d');
$sale_start = '2024-07-01';
$sale_end = '2024-07-10';
// Проверяем дату акции
if ($current_date >= $sale_start && $current_date <= $sale_end) {
// Проверяем, есть ли товар в категории 'sale'
if (has_term('sale', 'product_cat', $product->get_id())) {
$discount = 0.15; // 15% скидка
$price = $price * (1 - $discount);
}
}
return $price;
}3. Добавьте функцию в файл темы или в плагин
Рекомендуется добавлять код в файл functions.php дочерней темы или выделенный плагин, чтобы избежать потерь при обновлении.
Проверка результата после внедрения
- Перейдите на страницу товара, который относится к категории
sale. - Убедитесь, что текущая дата находится в промежутке акции (например, 2024-07-05).
- Проверьте отображаемую цену — она должна быть на 15% ниже базовой.
- Для товаров вне категории
saleцена не должна изменяться. - Для дат вне акции цена также должна оставаться без изменений.
Частые ошибки и как их исправить
- Цены не меняются: проверьте, что хук подключён правильно и код не конфликтует с другими плагинами, также убедитесь, что функция возвращает цену всегда.
- Цена меняется для всех товаров: убедитесь, что условие с
has_term()корректно проверяет категорию, и используйте правильный слаг категории. - Скидка применяется вне даты акции: проверьте формат даты и время сервера — используйте
current_time()WordPress для точности. - Цена не обновляется на странице товара: очистите кеш сайта и браузера, отключите кеширование на время теста.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы внутри фильтра цены — это влияет на скорость генерации страницы.
- Кэшируйте результаты проверки категорий, если товаров много, например, с помощью transient API.
- Сохраняйте даты акции в настройках темы или отдельном плагине, чтобы не править код напрямую.
Альтернативы: сравнение методов изменения цены
| Метод | Плюсы | Минусы |
|---|---|---|
| Использование фильтров WooCommerce (код) | Гибкий, не требует плагинов, полный контроль | Нужно писать код, возможны ошибки при обновлениях |
| Плагины скидок и акций | Простота настройки, визуальный интерфейс | Могут быть тяжёлыми, ограничены функционалом, конфликтуют с другими плагинами |
| Создание отдельного варианта товара с фиксированной скидкой | Чёткое разделение товаров, не влияет на основную цену | Увеличивает количество товаров, неудобно при большом каталоге |
Резюме
Автоматическое изменение цены товара при акциях в WooCommerce — задача решаемая без сторонних плагинов через фильтры woocommerce_product_get_price и woocommerce_product_get_regular_price. Главное — реализовать корректные проверки категорий и дат, а также протестировать работу в разных сценариях.