Диагностика проблемы: почему WooCommerce использует статус "обработка" по умолчанию
Стандартно WooCommerce назначает новым заказам статус processing (обработка), если оплата прошла успешно, или pending (ожидает оплаты) для других случаев. В некоторых бизнес-сценариях требуется изменить этот статус, например, сразу ставить заказ в статус on-hold или кастомный. Однако WooCommerce не предоставляет простой настройкой для этого.
Чтобы понять, какой статус установлен по умолчанию, можно отследить через отладчик или добавить простой хук, который логирует статус при создании заказа:
add_action('woocommerce_checkout_order_processed', function($order_id) {
$order = wc_get_order($order_id);
error_log('Статус нового заказа #'. $order_id .': ' . $order->get_status());
});Если вы видите, что статус всегда processing и хотите изменить это, значит нужно вмешиваться программно.
Пошаговое решение: установка кастомного статуса заказа по умолчанию
1. Добавление функции для изменения статуса сразу после создания заказа
Используем хук woocommerce_checkout_order_processed, чтобы сразу после создания заказа изменить его статус:
add_action('woocommerce_checkout_order_processed', 'set_default_order_status_custom', 10, 1);
function set_default_order_status_custom($order_id) {
$order = wc_get_order($order_id);
// Проверяем текущий статус
if ($order->get_status() === 'processing') {
// Меняем статус на нужный, например, on-hold
$order->update_status('on-hold', 'Статус изменён автоматически на on-hold');
}
}В этом примере все новые оплаченные заказы будут автоматически переведены в статус on-hold.
2. Создание и регистрация собственного статуса заказа (если нужно)
Если нужен уникальный статус, которого нет в WooCommerce, добавьте регистрацию:
add_action('init', 'register_custom_order_status');
function register_custom_order_status() {
register_post_status('wc-awaiting-shipment', array(
'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>')
));
}
// Добавляем в список статусов WooCommerce
add_filter('wc_order_statuses', 'add_custom_order_status_to_list');
function add_custom_order_status_to_list($order_statuses) {
$order_statuses['wc-awaiting-shipment'] = 'Ожидает отправки';
return $order_statuses;
}И изменить статус после создания:
add_action('woocommerce_checkout_order_processed', 'set_custom_default_status', 10, 1);
function set_custom_default_status($order_id) {
$order = wc_get_order($order_id);
if ($order->get_status() === 'processing') {
$order->update_status('awaiting-shipment', 'Статус изменён на кастомный');
}
}Проверка результата после внедрения
Чтобы проверить, что статус изменился, сделайте тестовый заказ с оплатой и:
- Проверьте в админке WooCommerce, что статус заказа соответствует нужному (например,
on-holdили кастомный). - Проверьте логи ошибок PHP, если добавляли логирование, что статус меняется без ошибок.
- Можно использовать следующий сниппет для вывода статуса на странице «Спасибо за заказ»:
add_action('woocommerce_thankyou', 'show_order_status_thankyou', 20);
function show_order_status_thankyou($order_id) {
$order = wc_get_order($order_id);
if ($order) {
echo '<p>Текущий статус вашего заказа: <strong>' . $order->get_status() . '</strong></p>';
}
}Частые ошибки и как их исправить
- Статус не меняется: Возможно, другой плагин или тема перезаписывает статус после вашего кода. Проверьте активные хуки с помощью плагинов типа Query Monitor.
- Кастомный статус не отображается в админке: Забыт фильтр
wc_order_statusesили неправильный префикс (wc-) в названии статуса. - Ошибка 500 или белый экран: Проверьте синтаксис PHP и логи ошибок сервера. Убедитесь, что используете правильные методы WooCommerce.
Практические советы по безопасности и производительности
- Не меняйте статус заказа до полной оплаты, иначе можно потерять логику WooCommerce и плагинов оплаты.
- Используйте только предусмотренные WooCommerce методы (
update_status()) для изменения статуса, чтобы избежать конфликтов. - Если меняете статус массово, делайте это через WP CLI для производительности.
- Тестируйте изменения в staging-среде, чтобы избежать сбоев в живом магазине.
Сравнение вариантов реализации изменения статуса заказа
| Способ | Плюсы | Минусы |
|---|---|---|
Изменение статуса через woocommerce_checkout_order_processed | Просто, работает сразу после создания заказа | Невозможно изменить статус до создания заказа |
| Регистрация кастомного статуса + смена статуса | Гибкость, собственные статусы в админке | Требует дополнительного кода и регистрации |
| Использование плагинов для управления статусами | Графический интерфейс, дополнительные функции | Зависимость от сторонних решений, нагрузка |