Диагностика проблемы: зачем нужны собственные статусы заказа в WooCommerce
По умолчанию WooCommerce предлагает ограниченный набор статусов для заказов: pending, processing, on-hold, completed, cancelled, refunded и failed. В реальных бизнес-сценариях этого недостаточно. Например, магазины с несколькими этапами обработки заказа или уникальной логистикой нуждаются в кастомных статусах, чтобы лучше отслеживать состояние заказа.
Если вы хотите добавить новые статусы и интегрировать их в панель администратора, уведомления и фильтры, нужно действовать через хуки и фильтры WooCommerce.
Шаги по созданию собственных статусов заказа
1. Регистрируем новый статус заказа
Добавим новый статус, например, awaiting_shipment — «Ожидает отправки».
function register_awaiting_shipment_order_status() {
register_post_status( 'wc-awaiting-shipment', array(
'label' => _x( 'Ожидает отправки', 'Order status', 'woocommerce' ),
'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_action( 'init', 'register_awaiting_shipment_order_status' );2. Добавляем статус в список доступных WooCommerce
Чтобы статус отображался в фильтрах и опциях смены статусов, нужно добавить его в массив статусов:
function add_awaiting_shipment_to_order_statuses( $order_statuses ) {
$new_order_statuses = array();
// Вставляем новый статус после processing
foreach ( $order_statuses as $key => $status ) {
$new_order_statuses[ $key ] = $status;
if ( 'wc-processing' === $key ) {
$new_order_statuses['wc-awaiting-shipment'] = 'Ожидает отправки';
}
}
return $new_order_statuses;
}
add_filter( 'wc_order_statuses', 'add_awaiting_shipment_to_order_statuses' );3. Добавляем новый статус в список для смены вручную
Чтобы в админке заказов статус можно было выбрать в выпадающем списке, используем фильтр woocommerce_admin_order_actions:
function add_awaiting_shipment_to_bulk_actions( $bulk_actions ) {
$bulk_actions['mark_awaiting-shipment'] = 'Отметить как "Ожидает отправки"';
return $bulk_actions;
}
add_filter( 'bulk_actions-edit-shop_order', 'add_awaiting_shipment_to_bulk_actions' );4. Отправка уведомлений при смене статуса
Для уведомления клиента или менеджера о смене статуса используйте хук woocommerce_order_status_{new_status}:
function notify_customer_awaiting_shipment( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
// Отправка стандартного email или кастомного
WC()->mailer()->customer_completed_order( $order_id );
}
add_action( 'woocommerce_order_status_awaiting-shipment', 'notify_customer_awaiting_shipment' );Проверка результата после внедрения
- В админке WooCommerce зайдите в список заказов и убедитесь, что в фильтрах появился статус «Ожидает отправки».
- При просмотре заказа в админке проверьте, что в списке доступных статусов можно выбрать новый.
- Смените статус заказа на «Ожидает отправки» и проверьте, что заказ отобразился в соответствующем фильтре.
- Проверьте, что уведомления (если включены) отправляются корректно.
Частые ошибки и как их исправить
- Статус не отображается в списках: Проверьте, что вы используете правильные ключи — для статусов WooCommerce нужен префикс
wc-, например,wc-awaiting-shipment. - Уведомления не отправляются: Убедитесь, что хук
woocommerce_order_status_awaiting-shipmentправильно указан и функция вызывается. Для кастомных уведомлений может понадобиться создать собственный email-класс. - Статус не сохраняется при смене: Проверьте, что функция регистрации статуса вызывается на
init, а не позднее, и что нет конфликтов с другими плагинами.
Практические советы по безопасности и производительности
- Не храните в статусах чувствительную информацию — статус должен описывать состояние заказа, без личных данных.
- Для уведомлений используйте кеширование или отложенную отправку, если у вас большой поток заказов, чтобы не перегружать сервер.
- Проверяйте совместимость с плагинами для отчетности и интеграций — некоторые из них могут не распознавать кастомные статусы.
Таблица сравнения вариантов внедрения собственных статусов заказа
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручная регистрация с хуками | Полный контроль, легковесность, без зависимостей | Требует знаний PHP, нужно прописывать уведомления, интеграции | Код из статьи |
| Плагины для статусов заказов (например, "Order Status Manager") | Простота настройки через UI, поддержка уведомлений | Зависимость от плагина, нагрузка, возможные конфликты | Плагин в репозитории WooCommerce |
| Комбинированный подход | Использование плагина + кастомизация кода | Сложнее поддерживать, возможны конфликты | Плагин + доработка функций |