Проблема: необходимость подтверждать заказы вручную перед обработкой в 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 или базе данных | Автоматизирует процесс, снижает нагрузку на операторов | Сложнее в реализации, требует тестирования | Большие магазины с интеграциями |
| Использование плагина для отложенных заказов | Готовое решение, поддержка и обновления | Дополнительная нагрузка, возможны конфликты | Если нет ресурсов на кастомную разработку |