wpcodes.ru wordpress WP Codеs

WooCommerce: автоматическое изменение стоимости товара по условию

Диагностика проблемы: почему автоматическое изменение цены нужно реализовать программно

В стандартном WooCommerce нет встроенного механизма для динамического изменения цены товара на основе произвольных условий, например, даты, количества в корзине, роли пользователя или внешних параметров. Часто пользователи пытаются решить это через купоны или скидки, но это не всегда удобно или достаточно гибко.

Если вы столкнулись с задачей изменить цену товара на летний период, для конкретной группы пользователей или при достижении определенного объема заказа, то единственный надёжный способ — использовать фильтры WooCommerce и писать кастомный код.

Пошаговое решение: как программно изменить цену товара в WooCommerce по условию

1. Используем фильтр woocommerce_product_get_price и woocommerce_product_get_regular_price

Эти фильтры позволяют перехватывать получение цены товара. Ниже пример, как уменьшить цену на 10% для пользователя с ролью "оптовик".

function custom_dynamic_price( $price, $product ) {
    if ( is_user_logged_in() ) {
        $user = wp_get_current_user();
        if ( in_array( 'wholesaler', (array) $user->roles ) ) {
            $price = $price * 0.9; // скидка 10%
        }
    }
    return $price;
}
add_filter( 'woocommerce_product_get_price', 'custom_dynamic_price', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2 );

2. Обработка цены в корзине и оформлении заказа

Чтобы цена сработала и в корзине, нужно дополнительно изменить цены в сессии. Для этого используем хук woocommerce_before_calculate_totals:

function custom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $price = $product->get_price();

        if ( is_user_logged_in() ) {
            $user = wp_get_current_user();
            if ( in_array( 'wholesaler', (array) $user->roles ) ) {
                $price = $price * 0.9;
                $cart_item['data']->set_price( $price );
            }
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 10, 1 );

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

  • Залогиньтесь под пользователем с ролью wholesaler и откройте страницу товара — цена должна быть меньше на 10%.
  • Добавьте товар в корзину и перейдите к оформлению заказа — цена в корзине и на странице оформления должна совпадать с измененной.
  • Выйдите из аккаунта или зайдите под другим пользователем — цена должна быть исходной.
  • Для проверки можно использовать плагин Query Monitor, чтобы убедиться, что фильтры применяются и цена меняется.

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

  • Цена меняется только на странице товара, но не в корзине: забыли изменить цену в объекте корзины через woocommerce_before_calculate_totals.
  • Цена сбрасывается при обновлении страницы корзины: фильтр применяется, но действие на корзине не срабатывает из-за условий проверки или приоритетов хуков.
  • Цена меняется для всех пользователей: не проверена роль пользователя или не учтено, что is_user_logged_in() может быть ложным для гостей.
  • Конфликты с плагинами кэширования: динамическое изменение цены не видно из-за кэширования страниц — нужно исключить страницы корзины и оформления заказа из кеша.

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

  • Минимизируйте работу с базой данных внутри фильтров, кэшируйте результаты, если необходимо определять роль пользователя или внешние параметры.
  • Избегайте тяжелой логики в woocommerce_before_calculate_totals, так как она вызывается при каждом обновлении корзины.
  • Тестируйте на staging-сайте с включенным кэшированием и отключенными плагинами, влияющими на цену, чтобы избежать неожиданных конфликтов.
  • Всегда проверяйте, что кастомный код не ломает корзину и оформление заказа, включая оплату и создание заказов.

Сравнение подходов к изменению цены в WooCommerce

СпособПреимуществаНедостаткиКогда использовать
Купоны и скидки WooCommerceПростая настройка без кодаОграниченная гибкость, нет условий по ролям и динамикеДля стандартных акций и скидок
Кастомный код с фильтрами ценыМаксимальная гибкость, динамическое управлениеТребует знаний PHP, возможны ошибки при неправильной реализацииСложные сценарии, индивидуальные условия
Плагины для динамического ценообразованияГотовые решения, часто с UIМогут быть дорогими, влиять на производительностьДля бизнес-пользователей без навыков программирования
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее