Диагностика проблемы: зачем нужны собственные статусы заказов в WooCommerce
Стандартные статусы WooCommerce (например, processing, completed, on-hold) подходят не для всех бизнес-сценариев. Например, если вам нужно внедрить промежуточные этапы обработки заказа, такие как "Ожидает подтверждения", "Сборка заказа" или "Передано в службу доставки", стандартный набор не позволяет это сделать без дополнительной доработки. Отсутствие нужных статусов усложняет контроль и автоматизацию.
Как создать собственный статус заказа в WooCommerce
Регистрация статуса с помощью фильтра wc_order_statuses и хука register_post_status
Для добавления нового статуса нужно зарегистрировать его в WordPress и добавить в список статусов WooCommerce. Ниже пример создания статуса Ожидает подтверждения с кодом wc-awaiting-confirmation:
add_action('init', function() {
register_post_status('wc-awaiting-confirmation', [
'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_filter('wc_order_statuses', function($order_statuses) {
$new_statuses = [];
// Вставляем новый статус после processing
foreach ($order_statuses as $key => $status) {
$new_statuses[$key] = $status;
if ('wc-processing' === $key) {
$new_statuses['wc-awaiting-confirmation'] = 'Ожидает подтверждения';
}
}
return $new_statuses;
});Добавление статуса в админку и выбор при редактировании заказа
Новый статус автоматически появится в списке статусов при редактировании заказа и в фильтрах списка заказов. Для корректного отображения в интерфейсе можно дополнительно добавить CSS-стили в админку:
add_action('admin_head', function() {
echo '<style>
.order-status.status-awaiting-confirmation {
background: #ffba00;
color: #000;
}
</style>';
});Автоматизация смены статуса: пример перевода заказа в новый статус после оплаты
Пример кода, который автоматически меняет статус заказа на wc-awaiting-confirmation после успешной оплаты (стандартный переход из pending в processing заменяется):
add_action('woocommerce_payment_complete', function($order_id) {
$order = wc_get_order($order_id);
if ($order) {
$order->update_status('awaiting-confirmation');
}
});Проверка результата после внедрения
- Создайте новый заказ с оплатой (например, через тестовый платеж).
- Перейдите в админку WooCommerce - Заказы.
- Проверьте, что заказ получил статус Ожидает подтверждения.
- При редактировании заказа вы должны видеть новый статус в выпадающем списке статусов.
- Статус должен отображаться цветом (если применили CSS из примера).
Частые ошибки и как исправить
- Статус не появляется в списке заказов: проверьте, что функция
register_post_statusвызывается наinit, и что ключ статуса начинается сwc-. - Статус не применился автоматически после оплаты: убедитесь, что хук
woocommerce_payment_completeсработал корректно, и что используется правильный код статуса без префиксаwc-при вызовеupdate_status. - Статус не отображается в интерфейсе или без нужного цвета: добавьте CSS в админку, проверьте селекторы и класс
status-с ключом статуса безwc-.
Практические советы по безопасности и производительности
- Избегайте чрезмерного добавления большого количества кастомных статусов, чтобы не усложнять интерфейс.
- Кэширование: после добавления статусов очистите кэш сайта и браузера, чтобы увидеть изменения.
- Используйте префикс
wc-для ключей статусов, чтобы WooCommerce корректно их распознавал. - Проверяйте совместимость с плагинами, которые работают с заказами (например, CRM или службы доставки), чтобы не нарушать их логику.
Сравнение вариантов добавления собственных статусов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php или кастомном плагине | Ручная регистрация через register_post_status и фильтры |
Полный контроль, легко адаптировать | Требует навыков программирования |
| Плагин Custom Order Statuses | Графический интерфейс для создания статусов | Просто для новичков, быстро | Может добавлять лишний функционал, зависит от стороннего кода |