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

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

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

Как работает изменение цены в WooCommerce: ключевые хуки

Для изменения цены товара в корзине и на странице товара используют фильтры:

  • woocommerce_get_price — влияет на цену товара в каталоге;
  • woocommerce_product_get_price и woocommerce_product_get_regular_price — фильтры цен объектов WC_Product;
  • woocommerce_before_calculate_totals — хук для изменения цены товаров в корзине перед подсчетом итогов.

Для динамического изменения цены в корзине лучше всего использовать woocommerce_before_calculate_totals, так как он позволяет модифицировать цену именно для текущей сессии без изменения данных в базе.

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

Рассмотрим кейс: если в корзине лежит больше 3 единиц одного товара, снизим цену на 10%.

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_change', 20, 1);function custom_dynamic_price_change($cart){if (is_admin() && !defined('DOING_AJAX')) return;if (did_action('woocommerce_before_calculate_totals') >= 2) return;foreach ($cart->get_cart() as $cart_item_key => $cart_item) {  $quantity = $cart_item['quantity'];  if ($quantity > 3) {    $original_price = $cart_item['data']->get_regular_price();    $new_price = $original_price * 0.9; // скидка 10%    $cart_item['data']->set_price($new_price);  }}

Этот код вставьте в файл functions.php активной темы или в кастомный плагин. Он работает только в корзине и на странице оформления заказа, не меняет цену в каталоге.

Добавление условий на пользовательскую роль

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

if (current_user_can('wholesale_customer') && $quantity > 3) {  // логика изменения цены}

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

  • Добавьте в корзину товар в количестве 4 и больше.
  • Убедитесь, что на странице корзины и оформления заказа цена товара изменилась с учетом скидки.
  • Проверьте, что на странице каталога и в админке цена осталась без изменений.
  • Попробуйте добавить товар в количестве 3 и убедитесь, что цена без скидки.
  • Если применяли условие по роли, проверьте под разными пользователями.

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

  • Цена меняется везде, включая админку или каталог — не используйте фильтр woocommerce_get_price для динамических скидок в корзине. Вместо этого применяйте woocommerce_before_calculate_totals.
  • Двойное применение скидки — вызов хука более одного раза. Добавляйте проверку did_action('woocommerce_before_calculate_totals') >= 2 чтобы избежать этого.
  • Цена не меняется при обновлении корзины — убедитесь, что при AJAX-обновлении корзины ваш код правильно подключен и хук вызывается.
  • Цена меняется для неправильных товаров — в цикле проверяйте ID товара или другие характеристики, чтобы применить скидку только к нужным товарам.

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

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

Сравнение подходов: код против плагинов

МетодПлюсыМинусыКогда использовать
Собственный PHP-кодПолный контроль, легковесность, без сторонних зависимостейТребует навыков программирования, сложнее поддерживатьУникальные бизнес-правила, небольшая команда разработчиков
Плагины скидок и динамического ценообразованияБыстрая настройка, готовый функционал, поддержкаМогут грузить сайт, ограничены в кастомизации, платныеСтандартные акции, отсутствие разработчиков
Автоматическое удаление старых записей и данных в WordPress через CRON
26.03.2026
WooCommerce: автоматическое отключение неиспользуемых плагинов для оптимизации производительности
07.06.2026
Как автоматизировать управление изображениями в WordPress
27.01.2026
Как удалить или изменить URL авторских страниц в WordPress без плагинов
03.03.2026
Как автоматизировать создание и удаление пользователей в WordPress с примерами кода
18.02.2026