Skip to content

Всё для WordPress, веб-разработки — и не только

🏪 Пользовательские статусы заказов WooCommerce: как создать и настроить

🏪 Пользовательские статусы заказов WooCommerce: как создать и настроить

Обработали заказ, а стандартного статуса для этого этапа нет. «Processing» для сборки, «Completed» для отправки, а между ними пустота. Магазин растёт, и семи дефолтных статусов WooCommerce перестаёт хватать.

Добавить собственный статус можно двумя способами: парой строк кода в functions.php или готовым плагином. Оба варианта рабочие и не ломают стандартную логику заказов. Ниже, пошагово, с проверенным кодом и альтернативой без программирования.

💡 Быстрый обзор:

  • Какие статусы идут в WooCommerce из коробки и почему их не хватает
  • Регистрация пользовательского статуса через PHP-код
  • Добавление нескольких статусов и кастомных email-уведомлений
  • Плагины для статусов заказов, когда код не подходит
  • Ответы на частые вопросы: HPOS, цвета, удаление, перевод

Какие статусы есть в WooCommerce из коробки

По умолчанию WooCommerce даёт семь статусов заказа. Каждый жёстко привязан к своей точке жизненного цикла:

Статус

Что значит

Pending payment

Заказ создан, оплата не поступила

Processing

Оплата получена, заказ в обработке

Completed

Заказ выполнен и закрыт

On hold

Ожидание подтверждения оплаты

Cancelled

Отменён покупателем или администратором

Refunded

Средства возвращены

Failed

Платёж не прошёл

Для типового магазина этого набора достаточно. Но как только появляется собственная логика обработки, например, производство на заказ или многоэтапная доставка, семи статусов перестаёт хватать. Нужен «В сборке», «Передан в доставку», «Ожидает предоплаты» или «Требует проверки менеджером».

Шаг 1: Регистрация пользовательского статуса через код

До WooCommerce 3.0 для статусов использовалась таксономия shop_order_status, и добавление нового было нетривиальным. Сейчас всё проще: статус заказа, это post status кастомного типа записи shop_order. Регистрируется одной функцией register_post_status() и фильтром wc_order_statuses.

Код добавляется в functions.php дочерней темы. Перед любыми правками сделайте полный бэкап сайта.

1// Регистрация нового статуса заказа
2function sdstudio_register_custom_order_status() {
3 register_post_status( 'wc-preparing', array(
4 'label' => 'В сборке',
5 'public' => true,
6 'exclude_from_search' => false,
7 'show_in_admin_all_list' => true,
8 'show_in_admin_status_list' => true,
9 'label_count' => _n_noop(
10 'В сборке (%s)',
11 'В сборке (%s)',
12 'sdstudio'
13 ),
14 ) );
15}
16add_action( 'init', 'sdstudio_register_custom_order_status' );
17
18// Добавление статуса в список WooCommerce
19function sdstudio_add_custom_order_status( $order_statuses ) {
20 $order_statuses['wc-preparing'] = 'В сборке';
21 return $order_statuses;
22}
23add_filter( 'wc_order_statuses', 'sdstudio_add_custom_order_status' );

После сохранения functions.php новый статус появится в выпадающем списке статусов заказа в админке и в отчётах WooCommerce. Система видит его как полноценный статус, можно фильтровать заказы, менять статус вручную и использовать в хуках.

Что здесь происходит

Функция register_post_status() создаёт новый post status с префиксом wc-, это соглашение WooCommerce. Параметр label задаёт читаемое название в админке. label_count, через _n_noop(), отвечает за корректное отображение счётчиков в русском интерфейсе.

Фильтр wc_order_statuses добавляет статус в массив, который WooCommerce использует для построения списка. Без этого шага статус будет зарегистрирован в системе, но не появится в выпадающем меню заказов.

Пользовательский статус заказа в админке WooCommerce

Визуально результат выглядит именно так, новый статус отображается в общем списке наравне со стандартными.

Шаг 2: Добавление нескольких статусов и email-уведомлений

Для одного статуса код выше работает отлично. Если нужно несколько, просто дублируете register_post_status() внутри той же функции и добавляете запись в массив $order_statuses. Например, для магазина с производством на заказ:

1function sdstudio_register_multiple_statuses() {
2 // Статус «В производстве»
3 register_post_status( 'wc-in-production', array(
4 'label' => 'В производстве',
5 'public' => true,
6 'exclude_from_search' => false,
7 'show_in_admin_all_list' => true,
8 'show_in_admin_status_list' => true,
9 'label_count' => _n_noop(
10 'В производстве (%s)',
11 'В производстве (%s)',
12 'sdstudio'
13 ),
14 ) );
15
16 // Статус «Готов к отправке»
17 register_post_status( 'wc-ready-to-ship', array(
18 'label' => 'Готов к отправке',
19 'public' => true,
20 'exclude_from_search' => false,
21 'show_in_admin_all_list' => true,
22 'show_in_admin_status_list' => true,
23 'label_count' => _n_noop(
24 'Готов к отправке (%s)',
25 'Готов к отправке (%s)',
26 'sdstudio'
27 ),
28 ) );
29}
30add_action( 'init', 'sdstudio_register_multiple_statuses' );
31
32function sdstudio_add_multiple_statuses( $order_statuses ) {
33 $order_statuses['wc-in-production'] = 'В производстве';
34 $order_statuses['wc-ready-to-ship'] = 'Готов к отправке';
35 return $order_statuses;
36}
37add_filter( 'wc_order_statuses', 'sdstudio_add_multiple_statuses' );

Обратите внимание: идентификатор статуса (первый аргумент register_post_status) всегда начинается с wc-. Без этого префикса WooCommerce не подхватит статус.

Email-уведомления для кастомных статусов

По умолчанию WooCommerce не отправляет письма при смене статуса на пользовательский. Чтобы включить оповещения, добавьте фильтр woocommerce_email_actions:

1function sdstudio_add_custom_status_email( $email_actions ) {
2 $email_actions[] = 'woocommerce_order_status_wc-preparing';
3 $email_actions[] = 'woocommerce_order_status_wc-in-production';
4 return $email_actions;
5}
6add_filter( 'woocommerce_email_actions', 'sdstudio_add_custom_status_email' );

После этого можно настроить шаблон письма в WooCommerce → Settings → Emails, новый статус появится в списке триггеров для кастомизации. Шаблон создаётся в дочерней теме по пути woocommerce/emails/, файл именуется по маске customer-<статус>.php.

Плагины для статусов заказов: когда код не подходит

Код, не единственный путь. Если править functions.php не хочется или статусы нужно менять часто, есть плагины. Два основных варианта:

WooCommerce Order Status Manager, официальное расширение от WooCommerce. Добавляет интерфейс для создания и редактирования статусов прямо из админки: WooCommerce → Settings → Order Statuses. Поддерживает email-уведомления, иконки, цвета и импорт/экспорт статусов. Платное, входит в некоторые тарифы WooCommerce.

Flexi Custom Order Status, бесплатный плагин из каталога WordPress.org. Тоже даёт визуальный редактор статусов, но с меньшим набором функций. Подходит для базовых сценариев: добавили статус, назначили цвет, включили письмо.

Какой путь выбрать:

  • Нужен один-два статуса и вы не боитесь кода, хватит functions.php.
  • Статусов много, они часто меняются или сайтом управляет клиент без технических навыков, берите плагин.
  • Используете HPOS (High-Performance Order Storage), оба подхода работают. Статусы по-прежнему базируются на register_post_status(), HPOS их не затрагивает.

Короткое видео выше показывает процесс добавления кастомного статуса за пять минут, от установки плагина до первого использования в заказах.

⁉️🤔 Частые вопросы

Работает ли кастомный статус с HPOS?

Да, полностью. HPOS меняет способ хранения данных заказа, но не трогает post status. Функция register_post_status() остаётся основным механизмом, ваш код будет работать и при включённом HPOS, и при выключенном.

Можно ли задать цвет для кастомного статуса?

Через код, только CSS-стилями в админке: цепляетесь за класс .status-wc-preparing и задаёте фон. Удобнее, через плагины: Order Status Manager и Flexi дают визуальный выбор цвета без единой строки кода.

Как удалить созданный статус?

Удалите его из register_post_status() и из фильтра wc_order_statuses. Заказы с этим статусом не исчезнут, они сохранятся в базе, но статус перестанет отображаться в выпадающем списке. Перед удалением переведите все заказы с удаляемым статусом в другой, чтобы не потерять их из виду.

Как перевести статусы на другой язык?

Параметр label в register_post_status() принимает строку, укажите название на нужном языке. Если сайт мультиязычный, оберните строку в вызов __() или _x() с текстовым доменом, и переводите через .po/.mo файлы как любой другой текст темы.

Обязательно ли префикс wc-?

Да. WooCommerce фильтрует статусы по этому префиксу. Если зарегистрировать статус без wc-, он не появится в админке заказов. Исключение, плагины: они сами добавляют префикс или обходят фильтрацию внутренними механизмами.

Можно ли добавить кастомный статус без кода и без плагина?

Без кода и без плагина, нет. WooCommerce не даёт интерфейса для создания статусов из коробки. Минимальный путь без программирования, бесплатный Flexi Custom Order Status из каталога WordPress.org. Установка в один клик, настройка через админку.

Что ставить под вашу задачу

Кастомные статусы заказов, один из тех механизмов WooCommerce, который легко пропустить, пока магазин маленький. Но как только появляется производство, поэтапная логистика или ручная проверка заказов, без них админка превращается в хаос из невнятных пометок.

  • Нужны один-два статуса и вы правили functions.php раньше, код из шага 1 закроет задачу за пять минут.
  • Нужен визуальный редактор и настройка цветов для клиента, Flexi Custom Order Status (бесплатный).
  • Статусы, часть сложного бизнес-процесса с email-сценариями и десятками этапов, WooCommerce Order Status Manager (официальное расширение).

Проверьте, какой из подходов вам ближе, и добавьте первый кастомный статус уже сегодня. Если используете другой способ или знаете плагин, которого нет в статье, поделитесь в комментариях.