Диагностика проблемы: зачем нужна автоматизация изменения цен в WooCommerce
В магазине на WooCommerce часто возникают ситуации, когда нужно массово и динамически менять цены на товары в зависимости от акций, распродаж или специальных условий. Ручное редактирование цен неудобно и занимает много времени, особенно при большом каталоге. Автоматизация позволяет оперативно менять цены без участия менеджера.
Чаще всего пользователи хотят реализовать такие сценарии:
- Скидка на определённые категории товаров в заданный период.
- Динамическое изменение цены по формуле (например, наценка или скидка в процентах).
- Автоматическое включение/отключение акций по расписанию.
Пошаговое решение: реализация автоматического изменения цен через фильтр WooCommerce
Шаг 1. Добавление фильтра для изменения цены товара
В WooCommerce для динамического изменения цены товара можно использовать фильтр woocommerce_product_get_price и woocommerce_product_get_regular_price. Они позволяют перехватывать запрос цены и менять её на лету.
Шаг 2. Пример кода для скидки 20% на категорию товаров с ID 15
add_filter('woocommerce_product_get_price', 'apply_dynamic_discount', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'apply_dynamic_discount', 10, 2);
function apply_dynamic_discount($price, $product) {
if (is_admin()) return $price; // Чтобы не мешать админке
// Проверяем, есть ли у товара категория с ID 15
if (has_term(15, 'product_cat', $product->get_id())) {
$discount_percentage = 20; // Скидка 20%
$new_price = $price * (1 - $discount_percentage / 100);
return round($new_price, 2);
}
return $price;
}Шаг 3. Добавление проверки периода действия акции
Чтобы скидка работала только в определённый период, добавим проверку даты:
function apply_dynamic_discount($price, $product) {
if (is_admin()) return $price;
$start_date = '2024-07-01';
$end_date = '2024-07-10';
$today = date('Y-m-d');
if ($today >= $start_date && $today <= $end_date) {
if (has_term(15, 'product_cat', $product->get_id())) {
$discount_percentage = 20;
$new_price = $price * (1 - $discount_percentage / 100);
return round($new_price, 2);
}
}
return $price;
}Проверка результата после внедрения
- Очистите кэш сайта и браузера.
- Перейдите на страницу товара из категории с ID 15 (можно узнать через админку или SQL-запрос).
- Убедитесь, что цена товара изменилась на 20% меньше в установленный период.
- Проверьте, что в админке цены остались без изменений — динамическая скидка применяется только на фронтенде.
- Проверьте работу на нескольких товарах и вне периода, скидка должна пропадать.
Частые ошибки и как их исправить
- Скидка не применяется: проверьте, правильно ли указан ID категории и есть ли у товара эта категория. Используйте
var_dump(has_term(15, 'product_cat', $product->get_id()))для отладки. - Цена в админке меняется: обязательно добавляйте условие
if (is_admin()) return $price;чтобы не ломать админку WooCommerce. - Цена меняется для всех товаров: убедитесь, что условие
has_term()корректно проверяет категории. - Формат цены неправильный: используйте
round($new_price, 2)для корректного округления до копеек. - Кэш мешает видеть изменения: отключите кеширование или очистите кэш после внесения изменений.
Практические советы по безопасности и производительности
- Не добавляйте тяжелые SQL-запросы или сложные вычисления в фильтр цены, это может замедлить загрузку страниц.
- Используйте transient API для кеширования результатов, если логика сложная и требует внешних запросов.
- Избегайте изменения цены в админке — это может привести к ошибкам при сохранении заказа.
- Для более сложных акций рассмотрите готовые решения, например, плагин Clearfy Pro с расширенными возможностями SEO и оптимизации на https://wpshop.ru/plugins/clearfy.
Сравнение вариантов реализации автоматических скидок
| Метод | Плюсы | Минусы | Применение |
|---|---|---|---|
Фильтр woocommerce_product_get_price в коде | Гибко, бесплатно, быстро менять цены на фронте | Требует знаний PHP, нет визуального интерфейса | Небольшие акции, индивидуальные условия |
| Плагины акций и скидок | Удобный интерфейс, много функций | Дополнительная нагрузка, платные версии | Сложные маркетинговые акции, массовые скидки |
| Редактирование цен вручную | Простота | Неэффективно при большом количестве товаров | Маленький магазин, единичные скидки |