В WooCommerce часто нужно не «изобрести новый процесс», а привести статусы заказов к языку команды: заменить On hold на понятное «Ожидает оплаты», убрать лишние формулировки в админке или добавить свой статус для внутренней обработки. Делать это плагином не всегда разумно: если задача точечная, проще и надежнее решить ее кодом в теме или мини-плагине.
Ниже разберем три сценария: переименование штатных статусов, добавление собственного статуса и проверка того, что он корректно работает в списке заказов, карточке заказа и фильтрах.
Когда достаточно переименовать штатный статус, а когда нужен новый
Если вам нужно только изменить текст, который видит менеджер в админке или покупатель в письме, обычно хватает фильтров WooCommerce. Это безопаснее: логика заказа не меняется, а значит меньше риск сломать автоматизации, интеграции с CRM и вебхуки.
Новый статус нужен, когда у заказа появляется отдельный этап обработки. Например: «Передан на сборку», «Ожидает ручной проверки», «Нужна сверка оплаты». В этом случае одного переименования мало — статус должен быть зарегистрирован как отдельный элемент системы.
| Подход | Что меняет | Плюсы | Минусы |
|---|---|---|---|
| Фильтр для названия статуса | Только отображение | Быстро, безопасно | Не добавляет новый этап |
| Регистрация собственного статуса | Логику и отображение | Гибко, подходит для процессов | Нужно проверить переходы и уведомления |
| Плагин для статусов | Обычно и то, и другое | Без кода | Лишняя зависимость, возможны конфликты |
Диагностика проблемы: что именно не устраивает в текущих статусах
Перед правкой кода стоит понять, где именно возникает неудобство. Это экономит время и помогает не трогать лишнее.
- Статус отображается на английском в админке, хотя сайт русскоязычный.
- Нужно переименовать статус только для менеджеров, но не менять внутреннюю логику.
- Нужен отдельный статус для склада или бухгалтерии.
- Статус есть в заказе, но не попадает в список фильтров в админке.
- После добавления статуса он не выбирается вручную или не сохраняется.
Если проблема только в названии, не регистрируйте новый статус. Если нужен новый этап обработки, сначала проверьте, какие действия завязаны на текущие статусы: письма, интеграции, автоматические смены статуса, экспорт заказов.
Переименование штатных статусов через фильтр
Для локального изменения названий используйте фильтр wc_order_statuses. Он меняет отображаемые подписи, не трогая сами идентификаторы статусов.
<?php
add_filter( 'wc_order_statuses', 'wpcat_rename_wc_order_statuses' );
function wpcat_rename_wc_order_statuses( $statuses ) {
if ( isset( $statuses['wc-on-hold'] ) ) {
$statuses['wc-on-hold'] = 'Ожидает оплаты';
}
if ( isset( $statuses['wc-processing'] ) ) {
$statuses['wc-processing'] = 'В обработке';
}
if ( isset( $statuses['wc-completed'] ) ) {
$statuses['wc-completed'] = 'Завершен';
}
return $statuses;
}Этот вариант подходит, если вы хотите сделать интерфейс понятнее для менеджеров. Важно: в письмах и внешних интеграциях может использоваться не только отображаемое имя, но и сам код статуса. Поэтому переименование не должно ломать сторонние сценарии, если они написаны корректно.
Где лучше размещать код
Если правка нужна для одного сайта, безопаснее вынести ее в мини-плагин или в functions.php дочерней темы. Для рабочих магазинов мини-плагин предпочтительнее: при смене темы логика не потеряется.
Как добавить собственный статус заказа WooCommerce
Когда нужен отдельный этап, регистрируйте статус через register_post_status() и добавляйте его в список доступных статусов WooCommerce через фильтр wc_order_statuses.
<?php
add_action( 'init', 'wpcat_register_custom_order_status' );
function wpcat_register_custom_order_status() {
register_post_status( 'wc-awaiting-check', 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>'
),
) );
}
add_filter( 'wc_order_statuses', 'wpcat_add_custom_order_status' );
function wpcat_add_custom_order_status( $statuses ) {
$new_statuses = array();
foreach ( $statuses as $key => $label ) {
$new_statuses[ $key ] = $label;
if ( 'wc-processing' === $key ) {
$new_statuses['wc-awaiting-check'] = 'Ожидает проверки';
}
}
return $new_statuses;
}Здесь статус вставляется сразу после processing, чтобы он был логично расположен в админке. Сам код статуса должен начинаться с wc-, иначе WooCommerce не распознает его как заказной статус.
Как вручную перевести заказ в новый статус
После регистрации статус появится в выпадающем списке на странице заказа. Если его нет, обычно проблема в одном из трех мест: код не загрузился, статус зарегистрирован слишком поздно или фильтр wc_order_statuses не отрабатывает.
Если нужно перевести заказ программно, используйте штатный метод объекта заказа:
<?php
$order = wc_get_order( 123 );
if ( $order ) {
$order->update_status( 'awaiting-check', 'Заказ отправлен на ручную проверку' );
}Обратите внимание: в update_status() передается идентификатор без префикса wc-.
Проверка результата после внедрения
После добавления кода проверьте не только визуальное отображение, но и поведение статуса в реальной карточке заказа.
- Откройте
WooCommerce → Заказыи убедитесь, что новый статус виден в списке. - Откройте любой заказ и проверьте, доступен ли статус в выпадающем списке.
- Сохраните заказ с новым статусом и обновите страницу.
- Проверьте фильтр по статусам в списке заказов.
- Если у вас есть письма, вебхуки или интеграция с CRM, убедитесь, что они не завязаны на старое состояние заказа.
Если статус отображается, но после сохранения откатывается назад, почти всегда проблема в том, что он не зарегистрирован через register_post_status() или зарегистрирован с ошибкой в ключе.
Частые ошибки и как их исправить
Статус виден в коде, но не появляется в админке
Проверьте, что вы добавили его и через register_post_status(), и через фильтр wc_order_statuses. Одного из этих шагов недостаточно.
Использован неправильный ключ статуса
В WooCommerce внутренний ключ хранится без префикса в методах заказа, но в списке статусов и при регистрации используется формат wc-.... Если перепутать формат, статус либо не сохранится, либо не будет отображаться.
Код вставлен в не тот файл
Если вы добавили код в родительскую тему, он может исчезнуть после обновления. Для магазина это плохой сценарий. Лучше использовать дочернюю тему или мини-плагин.
Сломались автоматические письма или интеграции
Это обычно происходит, когда сторонний код ожидает конкретный статус, а вы его переименовали или заменили на новый. В таком случае проверьте условия в плагинах доставки, CRM и автоматизации. Иногда нужно оставить старый статус и добавить новый рядом, а не заменять существующий.
Практические советы по безопасности и производительности
Для одного-двух статусов не нужен тяжелый плагин. Чем меньше сторонней логики, тем проще отлаживать магазин после обновлений WooCommerce.
- Храните изменения в мини-плагине, если сайт живет долго и код должен переживать смену темы.
- Не регистрируйте десятки статусов без реальной необходимости: это усложняет работу менеджеров.
- После обновления WooCommerce повторно проверьте список заказов и фильтры, особенно если у вас есть кастомные автоматизации.
- Если статус используется только внутри команды, не делайте его публичным без причины.
Если вам нужно не только переименование, но и более сложная логика обработки заказов, иногда удобнее вынести часть процессов в отдельный сервис или использовать специализированный плагин. Например, для контентных задач и внутренних блоков на сайте можно посмотреть решения WPShop, но для статусов заказов WooCommerce код обычно остается самым прозрачным вариантом.
Когда все сделано правильно, новый статус ведет себя как штатный: отображается в админке, сохраняется в заказе, участвует в фильтрах и не ломает существующие сценарии обработки.