WooCommerce: автоматическое изменение стоимости товаров по условиям на разных страницах

Проблема: как автоматически менять цену товара в WooCommerce в зависимости от страницы

В WooCommerce часто возникает задача изменить цену товара динамически в зависимости от страницы, на которой он отображается. Например, на странице категории или в корзине цена должна меняться в зависимости от условий (скидка, наценка, спецусловия для определённой категории пользователей). Стандартными средствами WooCommerce это не всегда удобно реализовать.

Диагностика задачи: когда и где нужно менять цену

Первый шаг — точно определить, в каких случаях цена должна меняться. Вот распространённые варианты:

  • Изменение цены на страницах архива (категории, теги)
  • Изменение цены на странице отдельного товара
  • Изменение цены в корзине и на странице оформления заказа
  • Изменение цены для определённой роли пользователя

Важно понимать, что WooCommerce выводит цену в разных местах через функцию wc_get_price_to_display() и связанные хуки. Менять цену следует до вывода, используя фильтры.

Пошаговое решение: пример динамического изменения цены на страницах категории и в корзине

Рассмотрим рабочий пример, где цена на странице категории увеличивается на 10%, а в корзине для определённой роли пользователя — уменьшается на 15%.

1. Изменение цены на страницах категории продукта

add_filter('woocommerce_product_get_price', 'custom_change_price_on_category_page', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_change_price_on_category_page', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_change_price_on_category_page', 10, 2);

function custom_change_price_on_category_page($price, $product) {
    if (is_product_category()) {
        // Увеличиваем цену на 10%
        $price = $price * 1.10;
    }
    return $price;
}

2. Изменение цены в корзине для пользователей с ролью "premium_customer"

add_action('woocommerce_before_calculate_totals', 'custom_change_price_in_cart_for_role', 10, 1);
function custom_change_price_in_cart_for_role($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    // Проверяем роль пользователя
    if (current_user_can('premium_customer')) {
        foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
            $original_price = $cart_item['data']->get_price();
            // Уменьшаем цену на 15%
            $new_price = $original_price * 0.85;
            $cart_item['data']->set_price($new_price);
        }
    }
}

Проверка результата после внедрения

Чтобы проверить, что изменения работают:

  • Перейдите на страницу категории товара и убедитесь, что цена увеличена на 10% по сравнению с обычной.
  • Залогиньтесь под пользователем с ролью premium_customer, добавьте товар в корзину и проверьте, что цена уменьшилась на 15%.
  • Проверьте, что для других пользователей и на других страницах цена не меняется.

Частые ошибки и как их исправить

  • Цена не меняется на странице архива. Проверьте, что используется правильный хук woocommerce_product_get_price, а не только woocommerce_get_price. Используйте фильтры для всех типов цены (get_price, get_regular_price, get_sale_price).
  • Изменение цены в корзине не работает. Убедитесь, что код добавлен в хук woocommerce_before_calculate_totals и что вы сбрасываете кэш корзины после изменений. Также проверьте, что условие по роли пользователя корректно.
  • Конфликты с кешированием. Кэширование страниц или объектов может приводить к тому, что цены не обновляются. Отключите кеш для страниц корзины и категории или используйте AJAX для динамического обновления.

Практические советы по производительности и безопасности

  • Не вызывайте тяжелые операции в фильтрах изменения цены — это может замедлить загрузку страниц.
  • Для условий по роли пользователя используйте кеширование результатов проверки роли, если проверка сложная.
  • Проверяйте, что цены не становятся отрицательными или нулевыми после изменений.
  • Тестируйте изменения в безопасной среде, особенно если в магазине много плагинов, влияющих на цены.

Сравнение способов изменения цены в WooCommerce

МетодПлюсыМинусыИспользование
Фильтры woocommerce_product_get_priceПростая реализация, работает на фронтендеНе влияет на цену в корзине и заказе без дополнительного кодаДля изменения отображаемой цены на страницах товаров и категорий
Хук woocommerce_before_calculate_totalsИзменяет цену в корзине и заказеСложнее в реализации, требует осторожностиДля изменения цены в корзине и оформления заказа
Плагины для динамических ценБыстро и удобно, часто с гибким интерфейсомМожет быть дорого, конфликтует с кастомным кодомДля сложных сценариев без разработки
Как добавить meta robots tag в WordPress для контроля индексации страниц
22.02.2026
Как создать автоматический экспорт данных из WordPress в CSV
31.12.2025
WooCommerce: автоматическое отключение неиспользуемых платёжных систем для оптимизации
22.06.2026
Как изменить стандартный заголовок записей в WordPress программно
06.03.2026
WooCommerce: оформление заказа без перезагрузки страницы
13.05.2026