Проблема: необходимость автоматизировать цены по акциям в WooCommerce
В стандартном WooCommerce для установки скидок на товары используются «акционная цена» (sale price), которую нужно задавать вручную. При большом ассортименте и частых акциях это неудобно и требует много времени. Кроме того, иногда нужно реализовать гибкие правила скидок, например, зависимость от даты, категории или пользовательской роли. В этой статье рассмотрим, как автоматизировать изменение цен товаров по акциям с помощью собственного кода.
Диагностика задачи: когда нужно автоматическое изменение цены
Прежде чем приступить, важно понять, что именно требуется:
- Автоматическое применение скидки на основе даты или события (например, распродажа с 1 по 7 число месяца).
- Скидки по категориям товаров или по меткам.
- Учет пользовательских ролей (например, скидка для оптовых покупателей).
- Изменение цены без необходимости вручную задавать «акционную цену» в админке.
Если вы используете плагины для акций и скидок, но хотите иметь легкий и контролируемый кодом способ, следующий раздел для вас.
Пошаговое решение: пример кода для автоматического изменения цены товара
Используем хук woocommerce_product_get_price и woocommerce_product_get_sale_price, чтобы подменять цену на лету перед выводом на фронтенде и в корзине.
Вот пример кода, который уменьшает цену на 20% для товаров из категории sale-category в период с 1 по 7 число каждого месяца:
add_filter('woocommerce_product_get_price', 'auto_discount_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'auto_discount_price', 10, 2);
function auto_discount_price($price, $product) {
if (is_admin()) {
return $price; // не менять цену в админке
}
// Проверяем дату
$day = date('j'); // число месяца без ведущих нулей
if ($day < 1 || $day > 7) {
return $price; // скидка только с 1 по 7
}
// Проверяем категорию
if (has_term('sale-category', 'product_cat', $product->get_id())) {
$discounted_price = $price * 0.8; // скидка 20%
return round($discounted_price, 2);
}
return $price;
}Этот код автоматически применит скидку 20% на все товары в категории sale-category только в первые 7 дней месяца.
Как добавить поддержку пользовательских ролей
Если нужно давать скидку только определённым ролям, добавьте проверку:
function auto_discount_price($price, $product) {
if (is_admin()) {
return $price;
}
$day = date('j');
if ($day < 1 || $day > 7) {
return $price;
}
if (!current_user_can('wholesale_customer')) { // пример роли
return $price; // скидка только для wholesale_customer
}
if (has_term('sale-category', 'product_cat', $product->get_id())) {
return round($price * 0.8, 2);
}
return $price;
}Проверка результата после внедрения
Чтобы убедиться, что код работает, сделайте следующее:
- Перейдите на страницу товара из категории
sale-categoryв период с 1 по 7 число. - Проверьте цену товара — она должна быть уменьшена на 20%.
- Добавьте товар в корзину и проверьте итоговую сумму — скидка должна применяться.
- Зайдите под пользователем без нужной роли (если используете роль) — цена должна отображаться без скидки.
- Проверьте в админке, что цены товара не изменились, код не влияет на базовые цены.
Частые ошибки и как их исправить
- Скидка не отображается на странице товара или в корзине
Убедитесь, что код добавлен в файлfunctions.phpили в плагин без ошибок. Проверьте, не кешируются ли страницы (очистите кеш плагина и браузера). - Цена меняется в админке
Добавьте проверкуis_admin()в начале функции, чтобы исключить админку из изменений. - Скидка применяется всегда, а не в заданный период
Проверьте правильность сравнения дат. В примере используется число месяца, можно заменить на более точную проверку черезDateTime. - Проблемы с пользовательскими ролями
Проверьте, что роль действительно существует и пользователь имеет эту роль. Для дебага используйтеvar_dump(wp_get_current_user()->roles);.
Практические советы по безопасности и производительности
- Храните код в дочерней теме или в собственном плагине, чтобы избежать потери при обновлении.
- Используйте кэширование с осторожностью — динамическое изменение цены может конфликтовать с кэшом. Настройте исключения для страниц с товарами.
- Проверяйте производительность сайта после внедрения кода, особенно если база товаров большая и есть сложные условия скидок.
- Для сложных правил лучше использовать готовые плагины, например, WooCommerce Dynamic Pricing & Discounts, если код становится громоздким.
Сравнение вариантов реализации скидок в WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное указание акционной цены в админке | Простота, поддержка из коробки | Трудозатратно при большом каталоге, нет автоматизации |
| Код на хуках (как в статье) | Гибкость, автоматизация, без плагинов | Требует навыков программирования, возможны ошибки |
| Плагины динамических скидок | Много функций, простота настройки | Нагрузка на сайт, стоимость, часто избыточно |