Диагностика задачи: зачем менять цены автоматически
В WooCommerce часто возникает необходимость динамически изменять цены товаров на основе определённых условий: скидки в зависимости от категории, акционные периоды, изменение цены для определённых ролей пользователей или массовые корректировки цен. Ручное изменение — трудоёмкий и рискованный процесс. В статье рассмотрим, как реализовать автоматическое изменение цен через код с проверкой условий.
Выбор метода реализации изменения цен
Есть три основных способа изменить цены автоматически:
- Использование фильтра
woocommerce_get_priceдля динамического изменения цены при выводе на сайте. - Изменение цен в базе данных программно через WP CLI или скрипты — для массовых и постоянных изменений.
- Использование плагинов скидок и акций (например, WooCommerce Dynamic Pricing), но это не всегда подходит из-за ограничений и производительности.
В статье сосредоточимся на первом варианте — динамическом изменении цены через PHP-фильтр, так как он гибкий и не требует изменения данных в базе.
Пошаговое решение: изменение цены по категории товара
Шаг 1. Добавляем фильтр в файл functions.php или в кастомный плагин
add_filter('woocommerce_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
if (is_admin()) return $price; // не менять цену в админке
// Проверяем, есть ли категория 'sale-products'
if (has_term('sale-products', 'product_cat', $product->get_id())) {
// Уменьшаем цену на 20%
$price = $price * 0.8;
}
return $price;
}Шаг 2. Проверяем работу на фронтенде
Откройте страницу товара из категории sale-products. Цена должна отображаться со скидкой 20%. Для товаров вне категории цена останется без изменений.
Изменение цены для пользователей с определённой ролью
add_filter('woocommerce_get_price', 'custom_price_for_role', 10, 2);
function custom_price_for_role($price, $product) {
if (is_admin()) return $price;
if (is_user_logged_in()) {
$user = wp_get_current_user();
if (in_array('wholesale_customer', $user->roles)) {
$price = $price * 0.7; // скидка 30% для оптовиков
}
}
return $price;
}Добавьте этот код, если хотите изменять цену для определённых ролей пользователей.
Проверка результата после внедрения
- Очистите кеш сайта и браузера.
- Откройте страницу товара в нужной категории или под нужной ролью.
- Проверьте цену на странице товара, в каталоге, в корзине. Цены должны корректно отображаться с учётом скидок.
- В админке цена останется исходной, что важно для корректного управления товарами.
Частые ошибки и как их исправить
- Ошибка: цена не меняется на странице корзины или оформления заказа. В этом случае добавьте фильтр
woocommerce_get_price_htmlиwoocommerce_cart_item_price, чтобы корректно отображать цену везде. - Ошибка: цена меняется в админке. Проверьте условие
is_admin(), оно должно возвращать исходную цену для административных страниц. - Ошибка: конфликт с другими плагинами для скидок. Проверьте приоритет фильтров и порядок их подключения, возможно, нужно повысить приоритет.
Практические советы по производительности и безопасности
- Кэширование: при использовании динамического изменения цен учитывайте, что кеширование страниц может показывать устаревшие цены. Настройте исключения для страниц с товарами или используйте AJAX для обновления цены.
- Производительность: не используйте тяжелые запросы в функциях фильтра. Например, избегайте вызовов сложных мета-запросов внутри фильтра
woocommerce_get_price. - Безопасность: не меняйте цены в базе данных напрямую без проверки прав пользователя, чтобы избежать злоупотреблений.
Сравнение методов изменения цен в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр woocommerce_get_price | Гибкость, не меняет данные в базе, легко откатить | Не всегда корректно работает с кэшем и корзиной |
| Изменение базы данных | Постоянное изменение цен, работает везде | Риск ошибок, сложность отката, нагрузка на БД |
| Плагины для скидок | Простая настройка, готовые функции | Может влиять на производительность, ограничена кастомизация |
Итог
Динамическое изменение цен через фильтр woocommerce_get_price — рабочее решение для многих задач. Подключайте дополнительные фильтры для корректного отображения в корзине и других местах. Следите за кешированием и тестируйте на реальных сценариях.