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

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

В интернет-магазинах на WooCommerce часто требуется менять цену товаров динамически: например, делать скидки на определённые категории, увеличивать цены при больших заказах, или применять специальные тарифы для определённых пользователей. Без автоматизации такие операции трудоёмки и подвержены ошибкам при ручном обновлении.

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

  • Какие условия влияют на изменение цены? (категории, количество, роль пользователя, дата и время)
  • Должно ли изменение быть временным (акция) или постоянным?
  • Какой способ реализации предпочтительнее: через код или плагины?

Пошаговое решение: изменения цены с помощью фильтра woocommerce_product_get_price

Самый прямой и гибкий способ — использовать фильтры WooCommerce для изменения цены на лету без изменения данных в базе. Рассмотрим пример, который снижает цену на 10% для товаров категории "скидка" и увеличивает цену на 5% для пользователей с ролью "оптовик".

add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2);

function custom_dynamic_price($price, $product) {
    // Проверим, есть ли у товара категория 'skidka'
    if (has_term('skidka', 'product_cat', $product->get_id())) {
        $price = $price * 0.9; // Снижаем цену на 10%
    }

    // Проверим роль пользователя
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        if (in_array('optovik', (array) $user->roles)) {
            $price = $price * 1.05; // Увеличиваем цену на 5%
        }
    }

    return round($price, 2);
}

Этот код нужно добавить в файл functions.php дочерней темы или в собственный плагин для сохранения при обновлениях.

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

  • Сохраняется исходная цена товара в админке
  • Изменения видны только покупателям на фронтенде
  • Легко отключить или изменить логику без риска повредить данные

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

  1. Создайте тестового пользователя с ролью optovik или используйте существующего.
  2. Создайте или отредактируйте товар, добавив его в категорию skidka.
  3. Войдите под тестовым пользователем и откройте страницу товара — проверьте, что цена увеличена на 5% и при этом снижена на 10% из-за категории (цена изменится на 0.9*1.05=0.945 от базовой).
  4. Выйдите из учётной записи — цена должна отображаться без увеличения, но со скидкой 10%.
  5. Для точной проверки используйте инструменты разработчика браузера или отладочный вывод (например, error_log), чтобы убедиться, что фильтр срабатывает правильно.

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

  • Цена не меняется на фронтенде: Проверьте, что фильтр подключён правильно и приоритет 10. Убедитесь, что функция возвращает число с правильным форматом.
  • Изменения влияют на админку: Фильтры woocommerce_product_get_price и woocommerce_product_get_regular_price влияют и на админку. Чтобы избежать, добавьте проверку if (is_admin()) return $price; в начале функции.
  • Цена отображается с неправильным количеством знаков: Используйте round($price, 2) для приведения цены к формату с двумя десятичными.
  • У пользователя нет нужной роли: Проверьте правильность названия роли и убедитесь, что пользователь авторизован.
  • Конфликт с кешем: При использовании плагинов кеширования сбросьте кеш после внесения изменений.

Альтернативные подходы: код vs плагины vs изменение цены в базе

МетодПлюсыМинусыКогда использовать
Фильтры WooCommerce (как выше)Гибкость, не меняет базу, быстроТребует навыков кода, может конфликтовать с плагинамиДля динамического изменения цен с учётом условий
Плагины скидок и динамического ценообразованияУдобный интерфейс, готовые функцииЧасто платные, могут сильно нагрузить сайтДля сложных правил без программирования
Изменение цены в базе (через update_post_meta)Простота, видно в админкеМеняется исходная цена, сложно откатитьПостоянные изменения без условий

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

  • Не используйте слишком сложные вычисления или запросы внутри фильтра — это замедлит загрузку страницы.
  • Проверяйте, что пользователь авторизован, только если это действительно нужно, чтобы избежать лишних вызовов.
  • Для массовых изменений цен применяйте WP-CLI или пакетные скрипты, а не фильтры, чтобы не нагружать сайт.
  • Если используете плагины кеширования, добавьте исключения для страниц с динамическими ценами или используйте AJAX для обновления цен на стороне клиента.
  • Храните копии изменений и тестируйте на тестовом сайте перед внедрением на продакшен.
Как удалить или изменить meta robots в WordPress без плагинов
25.01.2026
Как удалить или изменить метаданные для картинок в WordPress
27.03.2026
Как использовать WP-CLI для массового изменения метаданных постов в WordPress
03.05.2026
Как создать производительный виджет в WordPress с помощью REST API
13.12.2025
Как сделать производительный AJAX в WordPress без admin-ajax.php
06.04.2026