Диагностика проблемы: назначение ответственного за заказ по складу в WooCommerce
В интернет-магазинах на WooCommerce часто возникает необходимость, чтобы заказы автоматически распределялись между менеджерами или отделами, ответственными за конкретные склады или регионы. Стандартный функционал WooCommerce этого не предоставляет. Это создаёт сложности в обработке заказов и приводит к задержкам.
Типичные симптомы:
- Нужно вручную назначать менеджера после оформления заказа.
- Отсутствует автоматизация уведомлений по складам.
- Ошибки при использовании сторонних плагинов распределения заказов.
Пошаговое решение: автоматическое назначение ответственного менеджера по складу
1. Добавляем метаполе склада к товарам
Для начала каждому товару необходимо добавить метаполе, например, product_warehouse, в котором будет храниться склад. Это можно сделать вручную через пользовательские поля, или программно через add_post_meta или ACF.
add_action('woocommerce_product_options_general_product_data', function() {
woocommerce_wp_text_input([
'id' => 'product_warehouse',
'label' => 'Склад',
'desc_tip' => true,
'description' => 'Введите название склада для этого товара'
]);
});
add_action('woocommerce_process_product_meta', function($post_id) {
$warehouse = isset($_POST['product_warehouse']) ? sanitize_text_field($_POST['product_warehouse']) : '';
update_post_meta($post_id, 'product_warehouse', $warehouse);
});2. Создаём связь склад — ответственный менеджер
Определяем массив, где ключ — название склада, значение — ID пользователя менеджера. Это можно вынести в отдельный файл или опцию.
$warehouse_managers = [
'Москва' => 12, // ID пользователя менеджера
'СПб' => 15,
'Екатеринбург' => 22
];3. Автоматически назначаем ответственного при создании заказа
Используем хук woocommerce_checkout_create_order или woocommerce_new_order для проверки товаров в заказе, определения склада и назначения мета-данных с менеджером.
add_action('woocommerce_checkout_create_order', function($order, $data) use ($warehouse_managers) {
$assigned_manager = null;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$warehouse = get_post_meta($product_id, 'product_warehouse', true);
if ($warehouse && isset($warehouse_managers[$warehouse])) {
$assigned_manager = $warehouse_managers[$warehouse];
break; // Назначаем по первому найденному складу
}
}
if ($assigned_manager) {
$order->update_meta_data('responsible_manager_id', $assigned_manager);
}
}, 10, 2);4. Уведомляем менеджера о новом заказе
Добавим отправку письма ответственному менеджеру, используя стандартные функции WordPress или плагин уведомлений.
add_action('woocommerce_order_status_processing', function($order_id) {
$order = wc_get_order($order_id);
$manager_id = $order->get_meta('responsible_manager_id');
if ($manager_id) {
$user_info = get_userdata($manager_id);
if ($user_info && $user_info->user_email) {
wp_mail($user_info->user_email, 'Новый заказ на вашем складе', 'Поступил заказ #' . $order_id);
}
}
});Проверка результата после внедрения
- Создайте тестовый заказ с товаром, у которого указано метаполе склада.
- Проверьте, что в метаданных заказа появился ключ
responsible_manager_idс правильным ID менеджера. - Убедитесь, что менеджер получил уведомление на Email после смены статуса заказа на «В обработке».
- Проверьте, что при заказе товаров с разных складов назначается менеджер первого найденного товара.
Частые ошибки и как их исправить
- Не создаются метаполя складов у товаров — проверьте, что хуки
woocommerce_product_options_general_product_dataиwoocommerce_process_product_metaдобавлены и не конфликтуют с другими плагинами. - Ответственный менеджер не назначается — убедитесь, что массив
$warehouse_managersправильно определён и совпадает со значениями складов в товарах. - Письмо менеджеру не отправляется — проверьте настройки почты на сервере и что поле Email пользователя заполнено.
- Назначение менеджера по первому товару не подходит — измените логику в цикле, например, собрать всех менеджеров или использовать приоритеты.
Практические советы по безопасности и производительности
- Очистите и валидируйте данные складов перед сохранением, чтобы избежать XSS и SQL-инъекций.
- Кэшируйте массив менеджеров, если он загружается из базы или API, чтобы снизить нагрузку.
- Для крупных магазинов с большим количеством складов и менеджеров рассмотрите использование пользовательских таксономий для складов.
- Используйте nonce и проверки прав при сохранении метаполей товара.
Сравнение вариантов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код на functions.php | Ручной код с метаполями и хуками | Своя логика, нет лишних плагинов | Требует навыков разработки, поддержка на вас |
| Плагин распределения заказов | Готовые решения для назначения менеджеров | Быстрая установка, поддержка | Может быть дорогим, лишний функционал, нагрузка |
| Использование пользовательских таксономий | Склад как таксономия товаров | Удобное управление в админке | Сложнее интегрировать с назначением менеджера |