Понимание Custom Post Status в WooCommerce
WooCommerce по умолчанию использует стандартные статусы заказов: pending, processing, completed и др. Однако в реальных бизнес-сценариях часто требуется создавать дополнительные статусы для более гибкой логики обработки заказов, например, "ожидание оплаты", "ожидание отправки", "отменено клиентом" и т.п. Для этого WordPress поддерживает регистрацию кастомных статусов типа постов, которые можно применять к заказам WooCommerce, потому что заказы — это кастомный пост тип shop_order.
Диагностика задачи: зачем нужны Custom Post Statusы
Если вы столкнулись с проблемой, что стандартных статусов WooCommerce недостаточно для вашего бизнес-процесса, и требуется:
- Добавить новые этапы обработки заказов
- Автоматизировать смену статусов по определенным условиям
- Отслеживать заказы в новых статусах в админке и на фронтенде
— значит, нужно внедрять Custom Post Status с правильной интеграцией в WooCommerce.
Пошаговое решение: регистрация и использование Custom Post Status для заказов
Шаг 1. Регистрация нового статуса
Добавьте следующий код в файл функции вашей темы functions.php или в собственный плагин:
function register_custom_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_custom_order_status' );Обратите внимание, что префикс wc- обязателен для совместимости с WooCommerce.
Шаг 2. Добавление статуса в список доступных статусов заказов
Чтобы новый статус отображался в админке при выборе статуса заказа, добавьте фильтр:
function add_custom_order_status_to_list( $order_statuses ) {
$order_statuses['wc-awaiting-shipment'] = _x( 'Ожидает отправки', 'Order status', 'woocommerce' );
return $order_statuses;
}
add_filter( 'wc_order_statuses', 'add_custom_order_status_to_list' );Шаг 3. Автоматизация смены статуса при выполнении условий
Пример кода, который изменит статус заказа на awaiting-shipment после оплаты:
function set_awaiting_shipment_after_payment( $order_id ) {
if ( ! $order_id ) {
return;
}
$order = wc_get_order( $order_id );
if ( $order->get_status() === 'processing' ) {
$order->update_status( 'awaiting-shipment' );
}
}
add_action( 'woocommerce_payment_complete', 'set_awaiting_shipment_after_payment' );Проверка результата после внедрения
- В панели WooCommerce в списке заказов должен появиться новый статус "Ожидает отправки" с возможностью фильтрации по нему.
- При оплате заказа его статус автоматически меняется на "Ожидает отправки".
- Статус отображается корректно и на страницах просмотра заказа в админке.
Для проверки можно создать тестовый заказ, оплатить его тестовой платежной системой (например, через режим песочницы), и проверить статус в админке.
Частые ошибки и как их исправить
- Статус не отображается в списке заказов: убедитесь, что префикс
wc-присутствует в ID статуса. - Статус не меняется автоматически: проверьте, что хук
woocommerce_payment_completeсработал, и нет ошибок PHP. Используйтеerror_logдля отладки. - Статус не виден на фронтенде: WooCommerce по умолчанию не выводит кастомные статусы на страницах пользователей. Для вывода придется добавить фильтры на шаблоны.
Практические советы по безопасности и производительности
- Не регистрируйте слишком много кастомных статусов — это усложняет администрирование и может замедлить загрузку страниц заказов.
- Добавляйте автоматическую смену статуса только там, где это необходимо, чтобы избежать лишних запросов к базе.
- Для сложной логики используйте WP-Cron или отдельные сервисы — не перегружайте обработчики хуков.
Сравнение вариантов добавления статусов заказов
| Метод | Плюсы | Минусы | Применение |
|---|---|---|---|
Регистрация Custom Post Status через register_post_status() | Гибкость, полная интеграция с WooCommerce | Требует разработки, возможна путаница с большим количеством статусов | Используется при необходимости кастомных статусов |
| Использование плагинов (например, "WooCommerce Order Status Manager") | Удобство, интерфейс для создания статусов | Дополнительная нагрузка, зависимость от стороннего кода | Для быстрых решений без программирования |
| Использование мета-полей для статусов | Простота реализации | Не интегрируется с WooCommerce, нет поддержки фильтров и статусов | Для нестандартных меток, не влияющих на логику заказов |