Как отключить изменение стоимости товара в WooCommerce после оформления заказа

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

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

Чтобы проверить, изменяется ли цена после оформления, выполните следующие шаги:

  • Создайте тестовый заказ с конкретной ценой товара;
  • В админке WooCommerce откройте детали заказа и посмотрите цену позиции заказа ($item->get_total() и $item->get_subtotal());
  • Попробуйте вручную изменить цену товара в заказе — если это возможно, значит функционал редактирования открыт;
  • Проверьте, не срабатывают ли кастомные хуки или плагины, которые изменяют цену после оформления.

Пошаговое решение: запрет на изменение стоимости товара после оформления

1. Запрет редактирования цены в админке WooCommerce

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

add_action('woocommerce_before_order_itemmeta', function($item_id, $item, $product) {
    // Отключаем поля цены для позиции заказа
    remove_action('woocommerce_order_item_add_action_buttons', 'woocommerce_order_item_add_action_buttons');
    echo '<style>
      .wc-order-item-price, .wc-order-item-subtotal {
        pointer-events: none !important;
        opacity: 0.6;
      }
    </style>';
}, 10, 3);

Этот код сделает поля цены неактивными для редактирования через интерфейс админки.

2. Блокировка программного изменения цены заказа через хуки

Чтобы предотвратить изменение цены в заказе программно (например, плагинами), используйте хук woocommerce_before_calculate_totals и фиксируйте цену из начального значения:

add_action('woocommerce_before_calculate_totals', function($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return; // Исключаем админку
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        if (isset($cart_item['data']) && isset($cart_item['original_price'])) {
            $cart_item['data']->set_price($cart_item['original_price']);
        } else {
            $cart_item['original_price'] = $cart_item['data']->get_price();
        }
    }
});

Этот код сохраняет исходную цену каждого товара в корзине и не позволяет менять её в процессе оформления.

3. Запрет изменения цены при редактировании заказа в админке

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

add_filter('woocommerce_order_item_get_formatted_meta_data', function($formatted_meta, $item) {
    foreach ($formatted_meta as $key => $meta) {
        if ($meta->key === '_line_subtotal' || $meta->key === '_line_total') {
            unset($formatted_meta[$key]);
        }
    }
    return $formatted_meta;
}, 10, 2);

Этот фильтр убирает отображение и редактирование полей стоимости в метаданных позиции заказа.

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

  • Создайте новый заказ и завершите оформление;
  • Попробуйте отредактировать цену товара в заказе через админку — поле должно быть неактивным или отсутствовать;
  • Проверьте, что при повторном расчёте корзины цена не меняется;
  • Убедитесь, что в базе данных в таблице wp_woocommerce_order_items цены сохранились без изменений.

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

  • Цена всё ещё меняется после внедрения кода: убедитесь, что код добавлен в файл функции темы (functions.php) или в плагин, активирован и не конфликтует с другими хуками.
  • Поля цены остаются редактируемыми: возможно, тема или плагин переопределяет шаблон редактирования заказа. Проверьте наличие переопределений в woocommerce/admin/meta-boxes/views.
  • Конфликты с плагинами кеширования: очистите кеш и отключите кеширование админки, чтобы увидеть изменения.
  • Ошибка в JavaScript при блокировке полей: проверьте консоль браузера и исправьте ошибки, которые могут мешать работе скриптов WooCommerce.

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

  • Перед внедрением подобных ограничений сделайте резервную копию базы данных и файлов;
  • Для крупных магазинов рекомендуем использовать отдельный плагин с данной функциональностью, чтобы не потерять изменения при смене темы;
  • Проверяйте логи сервера и WooCommerce для выявления ошибок, связанных с изменением заказов;
  • Отключайте редактирование цены только для ролей, которым это не нужно (например, для менеджеров), оставляя администратору полный доступ;
  • Используйте current_user_can() для контроля доступа к изменению цен.

Сравнение вариантов реализации ограничения цены в WooCommerce

МетодПлюсыМинусыКомпромисс
Отключение полей цены через CSS/JSБыстро, простоМожно обойти через консоль браузераПодходит для базовой защиты, не для безопасности
Хуки для фиксации цены в процессе оформленияНадёжно фиксирует ценуТребует тестирования с плагинамиЛучше использовать вместе с ограничением UI
Удаление полей из админки (PHP)Полное исключение редактированияМожет сломать привычный интерфейсИспользовать с контролем ролей
Почему в WooCommerce не отправляются письма о возврате средств и как это исправить
20.04.2026
Как избежать конфликтов между плагинами в WordPress: диагностика и решение
13.06.2026
Как добавить автоматическое удаление старых чертежей в WordPress
10.01.2026
Как изменить атрибуты вариативных товаров в WooCommerce через код
21.05.2026
Как отключить возможность изменения адреса доставки в WooCommerce после оформления заказа
01.05.2026

Хотите научиться создавать сайты и зарабатывать на этом от 30 000 рублей в месяц?

Записаться на курс сейчас