Представьте: у вас интернет-магазин на 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 — статус есть в базе, но его нельзя выбрать в админке.
Добавить комментарий