WooCommerce по умолчанию предлагает ограниченный набор статусов заказов, таких как "В обработке", "Завершён", "Отменён" и другие. В реальных проектах часто возникает необходимость расширить этот список, добавив свои статусы, чтобы точнее отражать этапы обработки заказа. В этой статье разберём, как добавить и настроить пользовательские статусы заказов в WooCommerce с помощью кода, а также рассмотрим плагины для удобного управления.
Почему нужны пользовательские статусы заказов в WooCommerce
Стандартные статусы WooCommerce подходят для большинства магазинов, но есть ситуации, когда требуется более детальная классификация:
- Складские процессы: "Ожидает пополнения", "Отгружено на доставку".
- Производственные этапы: "В производстве", "Тестируется".
- Особые условия: "Ожидает подтверждения оплаты", "Требуется звонок".
Добавление собственных статусов помогает автоматизировать бизнес-процессы и информировать клиентов более точно.
Как добавить пользовательские статусы заказов в WooCommerce через код
Для добавления статусов нужно использовать хуки WordPress и WooCommerce. Рассмотрим пример добавления статуса "Ожидает подтверждения":
add_filter('wc_order_statuses', 'wplab_add_custom_order_statuses');
function wplab_add_custom_order_statuses($order_statuses) {
$order_statuses['wc-awaiting-confirmation'] = _x('Ожидает подтверждения', 'Order status', 'woocommerce');
return $order_statuses;
}
add_action('init', 'wplab_register_custom_order_status');
function wplab_register_custom_order_status() {
register_post_status('wc-awaiting-confirmation', 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>')
));
}
Этот код добавляет новый статус с ключом wc-awaiting-confirmation. Обратите внимание, что префикс wc- обязателен для корректной работы с WooCommerce.
Отображение пользовательского статуса в админке и на сайте
Чтобы статус отображался в фильтрах заказов в админке, достаточно зарегистрировать его с параметрами show_in_admin_all_list и show_in_admin_status_list. Для вывода статуса на страницах оформления заказа и в уведомлениях WooCommerce автоматически использует wc_order_statuses.
Как назначать пользовательский статус программно
Для изменения статуса заказа через код используйте метод update_status объекта заказа:
$order = wc_get_order($order_id);
$order->update_status('awaiting-confirmation', 'Статус изменён на Ожидает подтверждения');
Этот метод автоматически триггерит все стандартные действия WooCommerce, связанные с изменением статуса.
Плагины для управления пользовательскими статусами заказов
Если вы предпочитаете не писать код, существуют удобные плагины:
- WooCommerce Order Status Manager — позволяет создавать, редактировать и удалять статусы через интерфейс.
- Clearfy Pro — комплексный плагин для оптимизации и настройки WooCommerce, включая работу со статусами.
Использование этих плагинов значительно упрощает работу с кастомными статусами без необходимости программирования.
Использование пользовательских статусов в уведомлениях WooCommerce
Чтобы отправлять письма клиентам при переходе заказа в новый пользовательский статус, нужно добавить поддержку уведомлений. Для этого зарегистрируем новую почтовую рассылку:
add_filter('woocommerce_email_classes', 'wplab_add_custom_order_status_email');
function wplab_add_custom_order_status_email($emails) {
require_once 'class-wc-email-awaiting-confirmation.php';
$emails['WC_Email_Awaiting_Confirmation'] = new WC_Email_Awaiting_Confirmation();
return $emails;
}
Далее создайте файл class-wc-email-awaiting-confirmation.php на основе стандартных email классов WooCommerce, переопределив необходимые методы. Это позволит отправлять уведомления при переходе заказа в статус "Ожидает подтверждения".
Пример простого класса уведомления
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class WC_Email_Awaiting_Confirmation extends WC_Email {
public function __construct() {
$this->id = 'awaiting_confirmation';
$this->title = 'Ожидает подтверждения';
$this->description = 'Письмо отправляется, когда заказ получает статус "Ожидает подтверждения"';
$this->template_html = 'emails/customer-awaiting-confirmation.php';
$this->template_plain = 'emails/plain/customer-awaiting-confirmation.php';
add_action('woocommerce_order_status_awaiting-confirmation_notification', array($this, 'trigger'), 10, 2);
parent::__construct();
}
public function trigger($order_id, $order = false) {
if ($order_id && ! $order) {
$order = wc_get_order($order_id);
}
if (! $order) {
return;
}
$this->object = $order;
$this->recipient = $this->object->get_billing_email();
if (! $this->is_enabled() || ! $this->get_recipient()) {
return;
}
$this->send($this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments());
}
public function get_content_html() {
ob_start();
wc_get_template($this->template_html, array('order' => $this->object));
return ob_get_clean();
}
public function get_content_plain() {
ob_start();
wc_get_template($this->template_plain, array('order' => $this->object));
return ob_get_clean();
}
}
Вывод пользовательского статуса в интерфейсе
Чтобы добавить новый статус в список статусов заказа на фронтенде (например, в личном кабинете клиента), добавьте такой фильтр:
add_filter('woocommerce_my_account_my_orders_query', 'wplab_my_account_orders_custom_status', 10, 2);
function wplab_my_account_orders_custom_status($args, $customer_id) {
$args['post_status'][] = 'wc-awaiting-confirmation';
return $args;
}
Это позволит клиентам видеть заказы с новыми статусами.
Итоги
Добавление пользовательских статусов заказов в WooCommerce — мощный инструмент для тонкой настройки бизнес-процессов интернет-магазина. Вы можете реализовать это как программно, так и через плагины. Важно не забывать о корректном добавлении уведомлений и отображении статусов в административной и клиентской части сайта.
Используйте примеры из статьи, чтобы быстро внедрить кастомные статусы в свой проект, и при необходимости расширяйте функционал под свои задачи.