В этом материале разберёмся, как с помощью фильтров WooCommerce динамически изменять цену товара на сайте. Это полезно, если вам нужно реализовать скидки, надбавки или разные цены для разных пользователей без изменения основной цены в админке.
Понимание фильтров WooCommerce для цены
WooCommerce предоставляет несколько хуков и фильтров, которые позволяют менять цену товара на лету. Основные из них:
woocommerce_get_price— фильтр для изменения базовой цены товара;woocommerce_product_get_priceиwoocommerce_product_variation_get_price— более новые фильтры, применяемые к объектам товара и вариаций;woocommerce_cart_item_price— для изменения цены в корзине;woocommerce_get_price_html— для изменения отображаемого HTML цены.
Важно правильно выбрать фильтр, чтобы изменения применялись в нужных местах и не влияли на другие функции.
Пример: динамическая скидка для определённой роли пользователя
Предположим, нам нужно сделать скидку 10% на все товары для пользователей с ролью «партнёр». Для этого используем фильтр woocommerce_product_get_price:
function wpsystem_modify_price_for_partners($price, $product) {
if (current_user_can('partner')) { // замените 'partner' на вашу роль
$price = $price * 0.9; // скидка 10%
}
return $price;
}
add_filter('woocommerce_product_get_price', 'wpsystem_modify_price_for_partners', 10, 2);
add_filter('woocommerce_product_variation_get_price', 'wpsystem_modify_price_for_partners', 10, 2);
Этот код уменьшит цену для всех товаров и вариаций на 10% для пользователей с ролью «partner».
Подсказка по отладке
Если цена не меняется, проверьте, что роль пользователя установлена и фильтр правильно подключён. Также убедитесь, что другие плагины не переопределяют цену после вас.
Изменение цены в корзине с учётом дополнительных условий
В корзине можно менять цену с помощью фильтра woocommerce_cart_item_price, но лучше использовать woocommerce_before_calculate_totals, чтобы изменить цену товара для расчёта суммы заказа.
function wpsystem_apply_cart_item_discount($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
foreach ($cart->get_cart() as $cart_item) {
if (current_user_can('partner')) {
$original_price = $cart_item['data']->get_price();
$discounted_price = $original_price * 0.9; // 10% скидка
$cart_item['data']->set_price($discounted_price);
}
}
}
add_action('woocommerce_before_calculate_totals', 'wpsystem_apply_cart_item_discount', 10, 1);
Такой подход гарантирует, что цена в корзине и итоговая сумма будут с учётом скидки.
Изменение отображения цены товара
Если нужно изменить как цена отображается на странице товара или в каталоге, используйте фильтр woocommerce_get_price_html:
function wpsystem_custom_price_html($price_html, $product) {
if (current_user_can('partner')) {
$price_html .= ' <small>(скидка для партнёров)</small>';
}
return $price_html;
}
add_filter('woocommerce_get_price_html', 'wpsystem_custom_price_html', 10, 2);
Это добавит пометку рядом с ценой для пользователей с ролью «partner».
Полезные плагины для работы с ценами в WooCommerce
Для расширенных возможностей управления ценами можно использовать плагины:
- Clearfy Pro — оптимизация WooCommerce и WordPress, включая управление ценами и кэшированием;
- WPGPT — для создания автоматизации и подсказок на основе ИИ, можно интегрировать с процессом изменения цен;
- WPRemark — система отзывов, которая может взаимодействовать с акциями и ценами.
Практические советы и возможные проблемы
При работе с динамическим изменением цен учитывайте:
- Не изменяйте цену товара в базе данных напрямую — используйте фильтры;
- Проверяйте совместимость с другими плагинами, которые тоже могут менять цену;
- Внимательно тестируйте работу на разных ролях и состояниях корзины;
- Если нужно более сложное ценообразование, рассмотрите плагины для динамического ценообразования.
Как избежать конфликтов с кэшированием
Динамические цены могут не отображаться корректно при использовании кеширующих плагинов. Для этого:
- Используйте AJAX для обновления цены;
- Исключайте страницы с товарами из кеша для авторизованных пользователей;
- Настраивайте правила кеширования в плагинах вроде Clearfy Pro.