wpcat.ru wordpress WPCat.ru

Как переименовать и изменить статусы заказов WooCommerce без плагинов

В 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-.

Проверка результата после внедрения

После добавления кода проверьте не только визуальное отображение, но и поведение статуса в реальной карточке заказа.

  1. Откройте WooCommerce → Заказы и убедитесь, что новый статус виден в списке.
  2. Откройте любой заказ и проверьте, доступен ли статус в выпадающем списке.
  3. Сохраните заказ с новым статусом и обновите страницу.
  4. Проверьте фильтр по статусам в списке заказов.
  5. Если у вас есть письма, вебхуки или интеграция с CRM, убедитесь, что они не завязаны на старое состояние заказа.

Если статус отображается, но после сохранения откатывается назад, почти всегда проблема в том, что он не зарегистрирован через register_post_status() или зарегистрирован с ошибкой в ключе.

Частые ошибки и как их исправить

Статус виден в коде, но не появляется в админке

Проверьте, что вы добавили его и через register_post_status(), и через фильтр wc_order_statuses. Одного из этих шагов недостаточно.

Использован неправильный ключ статуса

В WooCommerce внутренний ключ хранится без префикса в методах заказа, но в списке статусов и при регистрации используется формат wc-.... Если перепутать формат, статус либо не сохранится, либо не будет отображаться.

Код вставлен в не тот файл

Если вы добавили код в родительскую тему, он может исчезнуть после обновления. Для магазина это плохой сценарий. Лучше использовать дочернюю тему или мини-плагин.

Сломались автоматические письма или интеграции

Это обычно происходит, когда сторонний код ожидает конкретный статус, а вы его переименовали или заменили на новый. В таком случае проверьте условия в плагинах доставки, CRM и автоматизации. Иногда нужно оставить старый статус и добавить новый рядом, а не заменять существующий.

Практические советы по безопасности и производительности

Для одного-двух статусов не нужен тяжелый плагин. Чем меньше сторонней логики, тем проще отлаживать магазин после обновлений WooCommerce.

  • Храните изменения в мини-плагине, если сайт живет долго и код должен переживать смену темы.
  • Не регистрируйте десятки статусов без реальной необходимости: это усложняет работу менеджеров.
  • После обновления WooCommerce повторно проверьте список заказов и фильтры, особенно если у вас есть кастомные автоматизации.
  • Если статус используется только внутри команды, не делайте его публичным без причины.

Если вам нужно не только переименование, но и более сложная логика обработки заказов, иногда удобнее вынести часть процессов в отдельный сервис или использовать специализированный плагин. Например, для контентных задач и внутренних блоков на сайте можно посмотреть решения WPShop, но для статусов заказов WooCommerce код обычно остается самым прозрачным вариантом.

Когда все сделано правильно, новый статус ведет себя как штатный: отображается в админке, сохраняется в заказе, участвует в фильтрах и не ломает существующие сценарии обработки.

×

Время действовать!

Суперцены на
WordPress!

-20%
на премиум темы

Не упусти шанс ⋙