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

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

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

Пошаговое решение: как запретить изменение стоимости и адреса доставки

1. Отключение возможности редактирования стоимости товара в заказе

Для этого добавим хук, который при попытке обновления заказа отменит изменения стоимости товаров.

add_action('woocommerce_before_save_order_items', 'wc_disable_order_item_price_edit', 10, 1); 
function wc_disable_order_item_price_edit($order) {
    foreach ( $order->get_items() as $item_id => $item ) {
        $original_price = wc_get_order_item_meta($item_id, '_original_product_price', true);
        if ( $original_price !== '' ) {
            $item->set_subtotal($original_price * $item->get_quantity());
            $item->set_total($original_price * $item->get_quantity());
        } else {
            wc_update_order_item_meta($item_id, '_original_product_price', $item->get_subtotal() / $item->get_quantity());
        }
    }
}

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

2. Блокировка изменения адреса доставки после оформления

Адрес доставки можно заблокировать на уровне админки и фронтенда, убрав соответствующие поля из редактирования.

add_filter('woocommerce_admin_billing_fields', 'wc_disable_admin_edit_address_fields');
add_filter('woocommerce_admin_shipping_fields', 'wc_disable_admin_edit_address_fields');
function wc_disable_admin_edit_address_fields($fields) {
    foreach ( $fields as $key => $field ) {
        $fields[$key]['custom_attributes'] = array('readonly' => 'readonly', 'disabled' => 'disabled');
    }
    return $fields;
}

// На фронтенде (например, в личном кабинете) можно скрыть форму для изменения адреса
add_filter('woocommerce_my_account_edit_address_formatted_address', 'wc_disable_frontend_address_edit', 10, 3);
function wc_disable_frontend_address_edit($address, $customer_id, $address_type) {
    if( $address_type === 'shipping' ) {
        return $address; // Возвращаем без изменений, можно добавить предупреждение
    }
    return $address;
}

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

  • Попробуйте зайти в админку WooCommerce и отредактировать заказ. Изменение цены товара в заказе должно автоматически откатываться к изначальной.
  • Проверьте страницы редактирования адреса доставки в админке — поля должны быть неактивными.
  • На фронтенде в личном кабинете пользователя убедитесь, что изменить адрес доставки невозможно или форма отсутствует.

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

  • Изменения стоимости все равно сохраняются. Проверьте, что код добавлен в functions.php активной темы или в кастомный плагин, и что нет конфликтующих плагинов, которые принудительно обновляют цену после сохранения.
  • Поля адреса не блокируются в админке. Возможно, другие хуки или плагин переопределяют поля. Используйте remove_filter или приоритеты в хуках, чтобы обеспечить выполнение вашего кода последним.
  • Пользователи все еще могут изменить адрес на фронтенде. Для полного контроля можно дополнительно отключить формы через JS или скрыть разделы в меню личного кабинета.

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

  • Храните оригинальные цены товаров в мета-данных заказа при создании заказа, чтобы иметь эталон для восстановления.
  • Используйте серверные проверки, а не только UI-блокировки, чтобы исключить возможность обхода через REST API или прямые запросы.
  • Регулярно тестируйте функционал после обновления WooCommerce и тем, так как обновления могут влиять на хуки и поведение.

Сравнение способов блокировки изменения данных в WooCommerce

МетодПлюсыМинусыКомпромиссы
Код через хуки (как в статье)Гибкий, контроль на уровне логики, без плагиновТребует знаний PHP, возможны конфликтыНужно поддерживать при обновлениях
Плагины для управления заказамиПростота настройки, поддержкаДополнительная нагрузка, ограниченная кастомизацияМожет влиять на производительность
Отключение форм на фронтенде через CSS/JSБыстрое решениеЛегко обойти, не защищает серверПодходит для UX, но не безопасности
Как отключить изменение стоимости и адреса доставки в WooCommerce после оформления заказа
06.08.2026
Как использовать REST API для создания нестандартных запросов в WordPress
09.04.2026
Автоматическое удаление неоплаченных заказов в WooCommerce: пошаговое руководство
31.07.2026
Как удалить старые псевдоверсии постов в WordPress: эффективные методы и примеры
13.04.2026
Как удалить версии постов в WordPress для оптимизации базы данных
25.03.2026

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

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