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

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

В стандартной установке WooCommerce заказ сразу переводится в статус обработка или выполнен после оплаты, что не всегда удобно для магазинов с ручной проверкой или подтверждением оператором. Например, при продаже товаров с ограниченным складом, услуг с индивидуальной настройкой или при согласовании условий с клиентом.

Диагностика текущей ситуации

Чтобы проверить, какой статус получают новые заказы, зайдите в WooCommerce → Заказы и обратите внимание на колонку «Статус». Если заказы сразу получают статус «Обработка» или «Завершён», значит нет механизма отложенного подтверждения.

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

1. Создаём новый статус заказа «Ожидает подтверждения»

Добавим в WooCommerce новый кастомный статус, чтобы отделять отложенные заказы:

add_action('init', function() {
    register_post_status('wc-pending-approval', [
        'label' => 'Ожидает подтверждения',
        'public' => true,
        'exclude_from_search' => false,
        'show_in_admin_all_list' => true,
        'show_in_admin_status_list' => true,
        'label_count' => _n_noop('Ожидает подтверждения <span class="count">(%s)</span>', 'Ожидает подтверждения <span class="count">(%s)</span>'),
    ]);
});

add_filter('wc_order_statuses', function($statuses) {
    $new_statuses = [];
    foreach ($statuses as $key => $label) {
        $new_statuses[$key] = $label;
        if ($key === 'wc-pending') {
            $new_statuses['wc-pending-approval'] = 'Ожидает подтверждения';
        }
    }
    return $new_statuses;
});

2. Перенаправляем новые заказы в статус «Ожидает подтверждения»

Используем хук woocommerce_thankyou, чтобы изменить статус сразу после создания заказа:

add_action('woocommerce_thankyou', function($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if ($order->get_status() === 'pending') {
        $order->update_status('pending-approval');
    }
});

3. Добавляем возможность оператору подтверждать заказ

В админке WooCommerce можно массово менять статус заказа или открыть сам заказ и изменить статус на «Обработка» после проверки. Чтобы упростить процесс, добавим кнопку подтверждения прямо на странице редактирования заказа:

add_action('woocommerce_order_item_add_action_buttons', function($order) {
    if ($order->get_status() === 'pending-approval') {
        echo '<button id="confirm_order" class="button button-primary" data-order-id="'.esc_attr($order->get_id()).'">Подтвердить заказ</button>';
    }
});

add_action('admin_footer', function() {
    ?>
    <script>
    jQuery(document).ready(function($) {
        $('#confirm_order').on('click', function(e) {
            e.preventDefault();
            var orderId = $(this).data('order-id');
            $.post(ajaxurl, {
                action: 'confirm_order',
                order_id: orderId,
                _wpnonce: '<?php echo wp_create_nonce('confirm_order_nonce'); ?>'
            }, function(response) {
                if(response.success) {
                    alert('Заказ подтверждён');
                    location.reload();
                } else {
                    alert('Ошибка: ' + response.data);
                }
            });
        });
    });
    </script>
    <?php
});

add_action('wp_ajax_confirm_order', function() {
    check_ajax_referer('confirm_order_nonce');
    $order_id = intval($_POST['order_id']);
    if (!$order_id) wp_send_json_error('Неверный ID заказа');
    $order = wc_get_order($order_id);
    if (!$order || $order->get_status() !== 'pending-approval') {
        wp_send_json_error('Заказ не найден или уже обработан');
    }
    $order->update_status('processing');
    wp_send_json_success();
});

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

  • Создайте новый заказ на сайте и убедитесь, что его статус после оформления — «Ожидает подтверждения».
  • В админке откройте заказ с таким статусом — должна отображаться кнопка «Подтвердить заказ».
  • Нажмите кнопку, заказ перейдёт в статус «Обработка».
  • Проверьте, что уведомления о новом статусе приходят на email или интегрированы с системой логистики.

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

  • Заказы не меняют статус на «Ожидает подтверждения» — проверьте, что хук woocommerce_thankyou подключён и функция вызывается. Иногда тема или плагины изменяют поведение оформления заказа.
  • Кнопка подтверждения не отображается — убедитесь, что хук woocommerce_order_item_add_action_buttons поддерживается в вашей версии WooCommerce, либо добавьте кнопку другим способом, например, через add_meta_boxes.
  • AJAX-запрос для подтверждения не работает — проверьте nonce, права пользователя (только админы или операторы должны иметь доступ), а также консоль браузера на ошибки JavaScript.

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

  • Всегда проверяйте nonce и права пользователя в AJAX-обработчиках, чтобы избежать несанкционированного изменения заказов.
  • Не храните лишние данные в сессиях пользователя — используйте метаданные заказов для состояния.
  • Для больших магазинов с высокой нагрузкой рассмотрите интеграцию с системами очередей и уведомлений, чтобы не блокировать интерфейс на длительное время.
  • Используйте Clearfy Pro для оптимизации WooCommerce и очистки базы от мусорных данных, чтобы ускорить работу сайта.

Сравнение вариантов реализации отложенных заказов

МетодПлюсыМинусыКогда использовать
Новый статус + ручное подтверждение из админкиПростой, прозрачный для оператора, не требует сторонних плагиновТребует ручного действия, возможна задержка обработкиМалые и средние магазины с ручной проверкой
Автоматическая проверка по API или базе данныхАвтоматизирует процесс, снижает нагрузку на операторовСложнее в реализации, требует тестированияБольшие магазины с интеграциями
Использование плагина для отложенных заказовГотовое решение, поддержка и обновленияДополнительная нагрузка, возможны конфликтыЕсли нет ресурсов на кастомную разработку
Как создать автоматические переадресации в WordPress без плагинов
25.02.2026
Как создать защищённые паролем страницы в WordPress
09.02.2026
Как удалить неиспользуемые метаданные в WordPress: практические решения и примеры
11.04.2026
WooCommerce: как сделать отложенные заказы с подтверждением оператора
13.05.2026
Как добавить удалённый вызов в WPBono Telegram Bot
12.01.2026