WooCommerce: установка и настройка дополнительных пользовательских стоимостей в заказах

Задача: добавить дополнительные пользовательские стоимости в заказ WooCommerce

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

Диагностика потребности

Перед внедрением решения важно удостовериться, что дополнительные стоимости действительно не могут быть реализованы через существующие методы (например, через отдельные продукты или встроенные способы доставки). Если необходима именно дополнительная строка с определённой суммой в заказе, которая будет учитываться при оплате и отображаться в админке и письмах, то нужно использовать хуки WooCommerce для добавления пользовательских сборов.

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

Рассмотрим пример, как программно добавить дополнительную пользовательскую стоимость к заказу на этапе оформления.

1. Добавление пользовательского поля на страницу оформления заказа

Добавим поле для ввода дополнительной стоимости в форму оформления заказа, например, плата за упаковку:

add_action('woocommerce_before_order_notes', 'wporder_add_custom_fee_field');
function wporder_add_custom_fee_field() {
    woocommerce_form_field('custom_fee', array(
        'type' => 'number',
        'class' => array('custom-fee form-row-wide'),
        'label' => 'Дополнительная плата за упаковку (руб)',
        'placeholder' => 'Введите сумму',
        'required' => false,
        'min' => 0,
        'step' => '0.01',
    ), '');
}

2. Валидация введённого значения

Проверим, что пользователь ввёл корректное число:

add_action('woocommerce_checkout_process', 'wporder_validate_custom_fee');
function wporder_validate_custom_fee() {
    if (isset($_POST['custom_fee']) && $_POST['custom_fee'] !== '') {
        if (!is_numeric($_POST['custom_fee']) || floatval($_POST['custom_fee']) < 0) {
            wc_add_notice('Введите корректную сумму дополнительной платы за упаковку.', 'error');
        }
    }
}

3. Добавление дополнительной стоимости к заказу

Добавим дополнительную стоимость к заказу на этапе подсчёта итогов:

add_action('woocommerce_cart_calculate_fees', 'wporder_add_custom_fee_to_cart');
function wporder_add_custom_fee_to_cart() {
    if (is_admin() && !defined('DOING_AJAX')) return;

    if (isset($_POST['post_data'])) {
        parse_str($_POST['post_data'], $post_data);
    } else {
        $post_data = $_POST;
    }

    if (isset($post_data['custom_fee']) && is_numeric($post_data['custom_fee']) && floatval($post_data['custom_fee']) > 0) {
        $fee = floatval($post_data['custom_fee']);
        WC()->cart->add_fee('Дополнительная плата за упаковку', $fee, true);
    }
}

4. Сохранение значения в метаданные заказа

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

add_action('woocommerce_checkout_create_order', 'wporder_save_custom_fee_meta', 20, 2);
function wporder_save_custom_fee_meta($order, $data) {
    if (isset($_POST['custom_fee']) && is_numeric($_POST['custom_fee'])) {
        $order->update_meta_data('custom_fee', floatval($_POST['custom_fee']));
    }
}

5. Отображение дополнительной стоимости в админке заказа

Добавим вывод пользовательской стоимости в метабоксе заказа:

add_action('woocommerce_admin_order_data_after_order_details', 'wporder_display_custom_fee_admin_order');
function wporder_display_custom_fee_admin_order($order){
    $custom_fee = $order->get_meta('custom_fee');
    if ($custom_fee) {
        echo '<p><strong>Дополнительная плата за упаковку:</strong> ' . wc_price($custom_fee) . '</p>';
    }
}

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

  • Перейдите на страницу оформления заказа, проверьте наличие поля "Дополнительная плата за упаковку".
  • Введите сумму, например, 150.00 и оформите заказ.
  • На странице корзины и в итогах заказа должна появиться строка с дополнительным сбором.
  • В админке WooCommerce откройте заказ, проверьте, что дополнительная стоимость отображается в метабоксе заказа.
  • Если вы используете email-уведомления, дополнительно можно добавить вывод этого значения в письма (это отдельный шаг).

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

  • Поле не появляется на странице оформления заказа: проверьте, что хук woocommerce_before_order_notes используется корректно и тема не переопределяет шаблон checkout.
  • Дополнительная стоимость не учитывается в корзине: убедитесь, что значение правильно передаётся через AJAX или форму. Иногда нужно добавить wp_localize_script для передачи данных.
  • Значение не сохраняется в заказе: проверьте, что в функции сохранения используются правильные хуки и что метаданные обновляются через update_meta_data.
  • Отображение в админке не работает: убедитесь, что используете корректный хук woocommerce_admin_order_data_after_order_details.

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

  • Всегда валидируйте и фильтруйте входящие данные: используйте is_numeric, floatval, а также встроенные функции валидации WooCommerce.
  • Не храните чувствительные данные в мета, если это не нужно.
  • Для больших магазинов с высокой нагрузкой лучше избегать добавления сложных вычислений в хук woocommerce_cart_calculate_fees, чтобы не замедлять оформление заказа.
  • Если поле не обязательно, добавьте проверку на пустоту, чтобы не создавать лишние записи в мета.

Сравнение вариантов реализации дополнительных сборов

МетодОписаниеПлюсыМинусы
Добавление через плагин (например, WooCommerce Checkout Fees)Использование готового решения для добавления сборовБыстрое внедрение, меньше кодаМожет быть перегружен лишним функционалом, ограниченная кастомизация
Ручная реализация с помощью хуков WooCommerceКод, добавляющий поле, валидацию, сбор и сохранениеМаксимальная кастомизация, контроль, малый весТребует знаний PHP, поддержка кода на разработчике
Добавление отдельного товара для дополнительных сборовСоздание товара "Упаковка", добавляемого вручнуюПростота, учёт в стандартных заказахНеудобно для динамических сумм, требуется вмешательство пользователя
Создание автоматических отчетов по проблемам и ошибкам в WordPress с примерами кода
07.01.2026
WooCommerce: автоматическое удаление отсутствующих товаров из каталога
15.06.2026
Автоматическое создание и отправка push-уведомлений при изменении заказов WordPress
26.12.2025
Автоматическое создание и отправка экспресс-отчетов по заказам в WordPress
02.04.2026
WooCommerce: установка и настройка дополнительных пользовательских стоимостей в заказах
29.06.2026