Диагностика задачи: зачем менять цену товаров программно
Часто требуется изменить цену товара динамически в WooCommerce: например, задать скидку по определённым условиям, изменить цену в зависимости от роли пользователя или атрибута товара. Важно понять, что стандартное изменение цены в админке не подходит для таких сценариев — нужна автоматизация через фильтры и хуки WooCommerce.
Пошаговое решение: применение фильтра woocommerce_product_get_price
Самый надёжный способ изменить цену товара на лету без изменения базы — использовать фильтр woocommerce_product_get_price. Он вызывается при получении цены товара и позволяет вернуть изменённое значение.
Пример кода для изменения цены товара с определённым ID:
add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
// Меняем цену только для товара с ID 123
if ($product->get_id() === 123) {
// Задаём новую цену, например, скидку 20%
$price = $price * 0.8;
}
return $price;
}Можно расширить логику, например, добавить проверку роли пользователя:
add_filter('woocommerce_product_get_price', 'price_for_vip_users', 10, 2);
function price_for_vip_users($price, $product) {
if (current_user_can('vip_customer')) {
$price = $price * 0.9; // 10% скидка для VIP
}
return $price;
}Изменение цены вариативных товаров
Для вариативных товаров фильтр сработает на каждом варианте — можно применять условия к вариациям по ID:
add_filter('woocommerce_product_get_price', 'custom_price_variations', 10, 2);
function custom_price_variations($price, $product) {
if ($product->is_type('variation') && in_array($product->get_id(), [456,789])) {
$price = $price - 100; // скидка 100 рублей
}
return $price;
}Проверка результата после внедрения
- Очистите кэш сайта и браузера.
- Откройте страницу товара, для которого меняется цена, и проверьте отображаемую цену.
- Проверьте цену в корзине и на странице оформления заказа — она должна совпадать с изменённой.
- Если есть роль пользователя (например, VIP), войдите под этой ролью и убедитесь, что скидка применяется.
Частые ошибки и как их исправить
- Цена не меняется на фронтенде: возможно, используется кэширование. Очистите кэш плагинов (WP Rocket, W3 Total Cache) и браузера.
- Изменённая цена не учитывается в корзине: убедитесь, что используете фильтр
woocommerce_product_get_price, а не устаревшие хуки. Также проверьте, что нет конфликтов с другими плагинами. - Цена ломает логику скидок и купонов: при сложных изменениях лучше использовать фильтр
woocommerce_get_priceи дополнительно проверять совместимость с другими хуками WooCommerce. - Изменение цены влияет на базу данных: не используйте прямое обновление поля
_priceв мета товара без необходимости — это может привести к рассинхронизации и ошибкам.
Практические советы по безопасности и производительности
- Не используйте вычисления цены с тяжёлыми запросами внутри фильтра — это может замедлить загрузку страниц.
- Для сложных условий лучше кэшировать результаты вычислений в transient API.
- Используйте явные проверки ролей и условий, чтобы избежать непреднамеренных изменений цен.
- Тестируйте изменения сначала на тестовом сайте.
Сравнение способов изменения цены в WooCommerce
| Способ | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
Фильтр woocommerce_product_get_price | Динамическая смена цены без записи в базу, совместимость | Не подходит для массовых изменений в базе | Скидки по ролям, атрибутам, условиям |
Обновление мета _price товара | Цена меняется в базе, видна в админке | Риск рассинхронизации, сложность поддержки | Статические изменения, миграции |
| Использование плагинов скидок | Удобство, поддержка, GUI | Зависимость от плагина, производительность | Стандартные скидки и акции |