Диагностика проблемы: когда и почему нужен автопереход статуса заказа
В интернет-магазинах на WooCommerce часто возникает задача — автоматически менять статус заказа после того, как товар отправлен клиенту. Например, при интеграции с курьерскими службами или сервисами отслеживания посылок. Без автоматизации приходится вручную менять статус на "Выполнен" или "Завершён", что увеличивает нагрузку на поддержку и приводит к задержкам.
Проверить, нужна ли вам автоматизация, можно по таким признакам:
- Вы используете внешнюю систему для логистики с API;
- Количество заказов велико, и ручное изменение статусов занимает много времени;
- Статусы заказов не обновляются вовремя, клиенты часто звонят уточнять статус.
Пошаговое решение: как автоматически менять статус заказа в WooCommerce после отправки
1. Подключение к API службы доставки
Для начала нужно получить от службы доставки API-ключ и документацию. На примере сервиса с webhook, который отправляет уведомление о смене статуса доставки:
add_action('rest_api_init', function () {
register_rest_route('wpmy/v1', '/shipment-update', [
'methods' => 'POST',
'callback' => 'wpmy_handle_shipment_update',
'permission_callback' => '__return_true',
]);
});
function wpmy_handle_shipment_update(WP_REST_Request $request) {
$data = $request->get_json_params();
if (empty($data['order_id']) || empty($data['shipment_status'])) {
return new WP_REST_Response('Invalid data', 400);
}
$order_id = intval($data['order_id']);
$shipment_status = sanitize_text_field($data['shipment_status']);
$order = wc_get_order($order_id);
if (!$order) {
return new WP_REST_Response('Order not found', 404);
}
// Логика обновления статуса заказа
if ($shipment_status === 'delivered') {
$order->update_status('completed', 'Автоматическое обновление: заказ доставлен');
} elseif ($shipment_status === 'shipped') {
$order->update_status('processing', 'Заказ отправлен');
}
return new WP_REST_Response('Status updated', 200);
}2. Настройка webhook в службе доставки
В админке службы доставки укажите URL вашего сайта для REST API эндпоинта, например:
https://example.com/wp-json/wpmy/v1/shipment-update
и настройте формат отправляемых данных в JSON с ключами order_id и shipment_status.
3. Безопасность и проверка данных
Рекомендуется добавить проверку ключа авторизации в заголовках запроса, чтобы не принимать случайные запросы:
function wpmy_handle_shipment_update(WP_REST_Request $request) {
$auth = $request->get_header('Authorization');
if ($auth !== 'Bearer ВАШ_ТОКЕН_ЗДЕСЬ') {
return new WP_REST_Response('Unauthorized', 401);
}
// остальной код...Проверка результата после внедрения
Чтобы убедиться, что автообновление работает:
- Отправьте тестовый POST-запрос на REST API с правильными данными;
- Проверьте в админке WooCommerce, что статус заказа изменился;
- Посмотрите логи сервера и debug.log на предмет ошибок;
- Попросите службу доставки сделать реальный webhook-запрос и убедитесь, что статус меняется.
Частые ошибки и как их исправить
- Ошибка 404 при вызове REST API: Проверьте, что постоянные ссылки (ЧПУ) включены в настройках WordPress и что маршрут зарегистрирован корректно.
- Заказы не обновляются: Убедитесь, что
order_idв запросе совпадает с реальным ID заказа в WooCommerce. - Нет авторизации: Если добавлена проверка токена, убедитесь, что служба доставки передаёт корректный заголовок
Authorization. - Статусы не меняются: Проверьте, что статусы WooCommerce совпадают с теми, что вы используете в коде (например, 'completed', 'processing').
Практические советы по безопасности и производительности
- Используйте nonce или OAuth для подтверждения запросов, если служба доставки поддерживает.
- Логируйте входящие запросы с ошибками в отдельный файл для быстрой диагностики.
- Не выполняйте тяжелые операции при обновлении статуса, чтобы не замедлять сайт.
- Используйте
update_statusс сообщением для прозрачности в истории заказа.
Сравнение вариантов реализации автообновления статуса
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Webhook + REST API | Слушаем уведомления службы доставки, меняем статус | Автоматизация, точное обновление, быстрый отклик | Нужна настройка API службы доставки, безопасность |
| Периодический скрипт (WP-Cron) | Проверяет статус заказов по API службы доставок | Не зависит от внешних вебхуков, можно дописать логику | Задержки между проверками, нагрузка на сервер |
| Ручное обновление | Менять статусы вручную в админке WooCommerce | Просто реализовать | Затратно по времени, ошибки человека |