Представьте: у вас интернет-магазин на WooCommerce, и вы отправляете заказы через три разных склада. Один — в Москве, другой — в Казани, третий — на маркетплейс-партнёру. В стандартном списке статусов WooCommerce нет ничего подходящего — только «В обработке», «Выполнен» и пара других базовых вариантов. Менеджеры путаются, клиенты не понимают, на каком этапе их заказ, а вы теряете контроль над логистикой.

Знакомая ситуация? Скорее всего, да. Стандартные статусы заказов WooCommerce покрывают самый простой сценарий: заказал → оплатил → отправили → доставили. Но реальный бизнес редко бывает таким линейным. И вот тут начинается интересное — можно создать собственные статусы, которые точно отражают ваш процесс.

Зачем вообще менять стандартные статусы заказов

WooCommerce из коробки даёт вам набор статусов: «Ожидает оплаты», «На удержании», «В обработке», «Завершён», «Отменён», «Возврат», «Не удалось». Для маленького магазина с физическими товарами и одной службой доставки этого хватает. Но как только бизнес растёт, появляются нюансы.

Вот реальные кейсы, где стандартных статусов не хватает:

  • Производство на заказ — нужно разделить «В обработке» на «Передано в производство», «Изготавливается», «Готово к отправке»
  • Дропшиппинг — «Отправлено поставщику», «Подтверждено поставщиком», «Ожидает поставки на склад»
  • Предзаказы — «Бронь», «Ожидает товара», «Товар поступил»
  • Проверка документов — для B2B-продаж, где нужна верификация контрагента
  • Частичная отгрузка — заказ из нескольких позиций, которые отправляются отдельно

Каждый такой статус — это точка контроля. Менеджер видит, что именно нужно делать с заказом прямо сейчас. Клиент получает точную информацию. Автоматизация работает корректно. А вы — не теряете деньги на путанице.

Стандартные статусы WooCommerce: что даёт система

Прежде чем добавлять свои, давайте посмотрим, что уже есть. WooCommerce оперирует двумя типами статусов:

  • Статусы оплаты — привязаны к платёжному шлюзу
  • Статусы выполнения — отражают логистический процесс

Вот полный набор по умолчанию:

Статус Slug Описание
Ожидает оплаты pending Заказ создан, платёж не получен
На удержании on-hold Ожидает действия (например, банковского перевода)
В обработке processing Оплата получена, заказ обрабатывается
Выполнен completed Заказ доставлен и завершён
Отменён cancelled Отменён покупателем или администратором
Возврат refunded Средства возвращены
Не удалось failed Ошибка оплаты

Семь статусов. Для простого магазина — ок. Для бизнеса с нестандартными процессами — мало.

Как добавить кастомный статус заказа в WooCommerce через код

Самый надёжный способ — зарегистрировать новый статус с помощью хуков WooCommerce. Никаких плагинов, полный контроль. Код добавляется в functions.php вашей дочерней темы или в кастомный плагин.

Регистрация нового статуса

Используем функцию register_post_status() WordPress и фильтр WooCommerce. Вот базовый пример:

// Добавляем кастомный статус "Передано на склад"
add_action( 'init', 'add_custom_order_statuses' );

function add_custom_order_statuses() {
    register_post_status( 'wc-warehouse', 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>'
        ),
    ) );
}

Обратите внимание на префикс wc- — он обязателен. Без него WooCommerce не распознает статус как свой.

Добавление в выпадающий список статусов

Зарегистрированный статус автоматически не появляется в выпадающем списке на странице заказа. Это давняя особенность WooCommerce. Чтобы исправить, добавим фильтр:

add_filter( 'wc_order_statuses', 'add_custom_status_to_list' );

function add_custom_status_to_list( $order_statuses ) {
    // Вставляем после "В обработке"
    $new_statuses = array();
    
    foreach ( $order_statuses as $key => $status ) {
        $new_statuses[ $key ] = $status;
        
        if ( 'wc-processing' === $key ) {
            $new_statuses['wc-warehouse'] = 'Передано на склад';
        }
    }
    
    return $new_statuses;
}

Теперь статус «Передано на склад» появится в дропдауне на странице редактирования заказа — ровно там, где менеджер его ищет.

Несколько кастомных статусов сразу

На практике одного статуса редко бывает достаточно. Вот пример с целым набором для интернет-магазина с доставкой через партнёров:

add_action( 'init', 'register_all_custom_statuses' );

function register_all_custom_statuses() {
    $statuses = array(
        'wc-warehouse'    => 'Передано на склад',
        'wc-packing'      => 'Комплектуется',
        'wc-shipped'      => 'Отправлено',
        'wc-in-transit'   => 'В пути',
        'wc-delivered'    => 'Доставлено',
    );
    
    foreach ( $statuses as $slug => $label ) {
        register_post_status( $slug, array(
            'label'                     => $label,
            'public'                    => true,
            'exclude_from_search'       => false,
            'show_in_admin_all_list'    => true,
            'show_in_admin_status_list' => true,
            'label_count'               => _n_noop(
                $label . ' <span class="count">(%s)</span>',
                $label . ' <span class="count">(%s)</span>'
            ),
        ) );
    }
}

add_filter( 'wc_order_statuses', 'add_all_custom_statuses_to_list' );

function add_all_custom_statuses_to_list( $order_statuses ) {
    $custom = array(
        'wc-warehouse'  => 'Передано на склад',
        'wc-packing'    => 'Комплектуется',
        'wc-shipped'    => 'Отправлено',
        'wc-in-transit' => 'В пути',
        'wc-delivered'  => 'Доставлено',
    );
    
    // Вставляем после "processing"
    $result = array();
    foreach ( $order_statuses as $key => $value ) {
        $result[ $key ] = $value;
        if ( 'wc-processing' === $key ) {
            $result = array_merge( $result, $custom );
        }
    }
    
    return $result;
}

Как добавить цветовую метку для кастомного статуса

Стандартные статусы WooCommerce цветные: зелёный для «Выполнен», жёлтый для «В обработке», красный для «Отменён». Ваши кастомные статусы по умолчанию будут без цвета — серая строчка в списке заказов. Это неудобно.

Добавим CSS для меток:

add_action( 'admin_head', 'custom_status_colors' );

function custom_status_colors() {
    echo '<style>
        .order-status.status-warehouse {
            background: #c6e1c6;
            color: #5b841b;
        }
        .order-status.status-packing {
            background: #f8dda7;
            color: #94660c;
        }
        .order-status.status-shipped {
            background: #c8d7e1;
            color: #2e4453;
        }
        .order-status.status-in-transit {
            background: #d5ead5;
            color: #2b6e2b;
        }
        .order-status.status-delivered {
            background: #c6e1c6;
            color: #5b841b;
        }
    </style>';
}

Теперь каждый статус визуально отличается. Менеджер за секунду находит нужные заказы — даже на экране с сотнями позиций.

Автоматическая смена статусов: когда менять вручную — не вариант

Ручная смена статусов — это нормально, когда заказов мало. Но если в день их 50 или 100, нужна автоматизация. WooCommerce предоставляет для этого хук woocommerce_order_status_changed.

Пример: автоматическая отправка email клиенту при смене статуса на «Отправлено»:

add_action( 'woocommerce_order_status_changed', 'notify_customer_on_shipment', 10, 4 );

function notify_customer_on_shipment( $order_id, $old_status, $new_status, $order ) {
    if ( 'shipped' === $new_status ) {
        $mailer = WC()->mailer();
        $subject = 'Ваш заказ #' . $order_id . ' отправлен!';
        $message = '<p>Здравствуйте!</p>';
        $message .= '<p>Ваш заказ #' . $order_id . ' передан в службу доставки.</p>';
        $message .= '<p>Ожидаемое время доставки: 2-3 рабочих дня.</p>';
        
        $mailer->send(
            $order->get_billing_email(),
            $subject,
            $mailer->wrap_message( $subject, $message )
        );
    }
}

Это простой пример. В реальном проекте вы можете:

  • Отправлять webhook на складскую систему при статусе «Передано на склад»
  • Создавать задачу в CRM при статусе «Ожидает проверки документов»
  • Уведомлять бухгалтерию при возврате
  • Триггерить SMS-рассылку через API провайдера

Кастомные статусы и аналитика

Отдельная тема — отчёты. WooCommerce по умолчанию считает «Выполнен» как успешную продажу. Если у вас «Доставлено» — кастомный статус — он не попадёт в стандартные отчёты.

Чтобы включить кастомный статус в отчёты:

add_filter( 'woocommerce_reports_order_statuses', 'include_custom_status_in_reports' );

function include_custom_status_in_reports( $statuses ) {
    $statuses[] = 'delivered';
    $statuses[] = 'shipped';
    return $statuses;
}

Без этого фильтра вы будете видеть статистику продаж, которая не отражает реальность. А это — уже проблема для принятия бизнес-решений.

Плагины vs. код: что выбрать

Существуют плагины для управления статусами — WooCommerce Order Status Manager, JEM Custom Order Status и другие. У каждого свой подход. Вот когда что имеет смысл:

Критерий Код Плагин
Гибкость Полная Ограничена настройками
Зависимость от обновлений Нет Да, возможны конфликты
Скорость внедрения Нужен разработчик Быстро, через интерфейс
Производительность Минимальный оверхед Дополнительные запросы к БД
Стоимость Только работа разработчика Бесплатно / подписка $49-99/год

Мой совет: если статусов немного (2-5 штук) и они не меняются каждый месяц — пишите код. Это чище, быстрее работает и не зависит от стороннего разработчика плагина. Если же вы экспериментируете с процессами и статусы могут часто меняться — плагин даст больше гибкости без участия программиста.

Частые ошибки при работе с кастомными статусами

Я видел десятки проектов, где кастомные статусы добавлены «криво». Вот типичные проблемы:

  • Забыли префикс wc- — статус регистрируется, но WooCommerce его не видит в своих механизмах. Платёжные шлюзы не переключают, отчёты не считают.
  • Не добавили в wc_order_statuses — статус есть в базе, но его нельзя выбрать в админке.

Добавить комментарий

Разработка сайтов на Wordpress