Диагностика задачи: зачем и когда нужно автоматически менять цены по акциям
В WooCommerce часто возникает задача временно изменить цену товара при проведении акции или скидки без ручного редактирования каждого товара. Это критично для магазинов с большим каталогом, где менять цены вручную неудобно и рискованно. Автоматизация позволяет задать условия акции (например, по категории, тегу или конкретной дате) и динамично менять цены на фронтенде и в корзине.
Как автоматически менять цену товара по акции через хук woocommerce_product_get_price
Для динамического изменения цены используйте фильтр woocommerce_product_get_price, который применяется при получении цены товара. Ниже пример, как задать скидку 20% на все товары категории "Распродажа" с 1 по 7 июля 2024 года:
add_filter('woocommerce_product_get_price', 'custom_sale_price_on_promotion', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_sale_price_on_promotion', 10, 2);
function custom_sale_price_on_promotion($price, $product) {
// Проверяем дату акции
$current_date = current_time('Y-m-d');
if ($current_date < '2024-07-01' || $current_date > '2024-07-07') {
return $price; // акция неактивна
}
// Проверяем, что товар в категории "sale"
if (has_term('sale', 'product_cat', $product->get_id())) {
$discount = 0.20; // 20% скидка
$new_price = $price * (1 - $discount);
return round($new_price, 2);
}
return $price;
}Код применяет скидку только на фронтенде и в корзине без изменения базы данных — безопасный вариант для временных акций.
Пошаговое внедрение решения
- Добавьте код в файл
functions.phpактивной дочерней темы или в свой плагин для кастомизации. - Убедитесь, что категория с ярлыком
saleсуществует и назначена товарам для акции. - Настройте даты в коде под свои сроки акции.
- Очистите кэш сайта и браузера.
- Проверьте отображение цен на страницах товаров и в корзине.
Проверка результата
Проверить корректность изменения цены можно следующим образом:
- Откройте страницу товара из категории "sale" в указанное время акции — цена должна быть снижена на 20%.
- Добавьте товар в корзину — итоговая сумма должна учитывать скидку.
- После окончания даты акции цены должны вернуться к исходным.
- В панели администратора цены не меняются — скидка применяется только визуально.
Частые ошибки при реализации и как их исправить
- Скидка не применяется на страницах магазина: Проверьте, что вы используете и фильтр
woocommerce_product_get_regular_priceвместе сwoocommerce_product_get_price, иначе цена для сравнения не изменится. - Скидка применяется и в админке: Добавьте проверку
if (is_admin()) return $price;в начале функции, чтобы избежать изменения цены в админке. - Кэш мешает увидеть изменения: Очистите кэш плагина и браузера, отключите кэширование на время теста.
- Товар не в нужной категории: Проверьте slug категории и используйте функцию
has_termкорректно.
Практические советы по безопасности и производительности
- Не меняйте цены напрямую в базе данных, чтобы избежать конфликтов с отчетами и аналитикой.
- Используйте кеширование внутри функции, если количество товаров велико и проверка категорий нагружает сервер:
static $sale_products = null;
if (is_null($sale_products)) {
$sale_products = get_posts([ 'post_type' => 'product', 'numberposts' => -1, 'tax_query' => [[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'sale',
]], 'fields' => 'ids' ]);
}
if (in_array($product->get_id(), $sale_products)) {
// применяем скидку
}- Всегда проверяйте даты через
current_time('Y-m-d')для корректной работы по часовому поясу WordPress. - Для более сложных условий используйте дополнительные метаданные товара и хук
woocommerce_before_calculate_totalsдля изменения цены в корзине.
Сравнение подходов: код vs плагины для акций WooCommerce
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код (фильтры цен) | Гибкость, не нагружает базу, бесплатный | Требует навыков, возможные ошибки при неправильном коде | Использовать вместе с тестированием на staging |
| Плагины скидок (например, WooCommerce Dynamic Pricing) | Простой интерфейс, поддержка сложных правил | Дополнительная нагрузка, платные версии | Использовать, если нужно быстро и с поддержкой |