Диагностика проблемы: почему ручное изменение цен неудобно
В WooCommerce при проведении акций часто возникает необходимость массово менять цены на товары: устанавливать скидки, менять цену на определённый процент или фиксированную сумму. Ручное редактирование каждого товара занимает много времени и повышает вероятность ошибок. Особенно это актуально для магазинов с сотнями и тысячами товаров.
Автоматизация ценовых изменений с помощью кода позволяет быстро и безопасно вносить изменения, применять сложные условия и управлять акциями централизованно.
Как автоматически изменить цену товара по акции: настройка через код
Рассмотрим пример, когда нужно применить скидку 20% ко всем товарам из определённой категории. Для этого используем хук woocommerce_product_get_price и woocommerce_product_get_regular_price, чтобы динамически изменять цену при выводе.
Код для functions.php вашей темы или в кастомном плагине:
add_filter('woocommerce_product_get_price', 'custom_sale_price_for_category', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_sale_price_for_category', 10, 2);
function custom_sale_price_for_category($price, $product) {
if (is_admin()) return $price; // Не меняем в админке
// Укажите slug категории для акции
$sale_category_slug = 'aktsiya';
if (has_term($sale_category_slug, 'product_cat', $product->get_id())) {
$discount_percent = 20; // скидка 20%
$new_price = $price * (1 - $discount_percent / 100);
return round($new_price, 2);
}
return $price;
}Этот код динамически уменьшает цену на 20% для товаров из категории "aktsiya" при выводе в магазине и на страницах товара. В админке цена остаётся без изменений.
Как адаптировать код под другие условия
- Для скидки фиксированной суммы замените формулу на
$new_price = max(0, $price - $fixed_discount); - Для нескольких категорий используйте массив и проверяйте
has_termдля каждого - Для ограничения по дате акции добавьте проверку текущей даты через
current_time('timestamp')
Проверка результата после внедрения
Чтобы убедиться, что скидка применяется корректно:
- Перейдите на страницу товара из категории акции и проверьте цену — она должна быть на 20% меньше базовой.
- Проверьте страницу корзины и оформления заказа — цена должна быть изменённой.
- В админке откройте редактирование товара — цена должна оставаться без изменений, чтобы не влиять на складской учёт.
- Отключите код и убедитесь, что цены возвращаются к исходным.
Частые ошибки и как их исправить
- Цены не меняются на фронтенде
Проверьте, что код подключён и не возвращает цену в админке. Убедитесь, что slug категории указан верно и товар действительно относится к ней. - Скидка применяется в админке
Добавьте условиеif (is_admin()) return $price;в начале функции, чтобы не менять цены в панели управления. - Расхождение цен в разных местах сайта
Возможно, другие плагины или темы кэшируют цены. Очистите кэш и проверьте шаблоны вывода. - Неправильное округление цен
Используйтеround($new_price, 2)для корректного отображения с двумя знаками после запятой.
Практические советы по безопасности и производительности
- Не изменяйте цену товара в базе данных — используйте динамическое изменение через фильтры, чтобы избежать проблем с учётом продаж и отчётностью.
- Не добавляйте сложную логику и запросы в функцию фильтра, чтобы не замедлять загрузку страниц.
- Тестируйте код на тестовом сайте перед применением на боевом.
- Если нужно массово менять цены навсегда, используйте WP-CLI или SQL-запросы с бэкапом данных.
Сравнение подходов автоматического изменения цен в WooCommerce
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Динамическое изменение через фильтры | Легко внедрить, не трогает базу, гибко | Требует знания PHP, не сохраняется в базе | Отлично для временных акций |
| Изменение цен через админку вручную | Просто, не требует кода | Долго, риск ошибок, неудобно при большом каталоге | Подходит для редких изменений |
| Массовое обновление через WP-CLI или SQL | Быстро для большого количества товаров | Риск потерять данные, требует резервного копирования | Лучше для постоянных изменений |