WooCommerce: автоматическая удалённая отгрузка и синхронизация остатков товаров

Диагностика проблемы с синхронизацией остатков в WooCommerce

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

Для диагностики проблемы проверьте следующие моменты:

  • Корректно ли настроена интеграция с вашей системой складского учёта (WMS)?
  • Используется ли правильный API или вебхук для уведомления WooCommerce об отгрузках?
  • Обрабатываются ли статусы заказов, которые инициируют изменение остатков?
  • Существуют ли ошибки в логах WooCommerce или сервера при попытках синхронизации?

Как проверить ошибки в логах WooCommerce

Перейдите в WooCommerce → Статус → Логи и выберите последние записи, связанные с обновлением запасов. Ошибки HTTP, тайм-ауты или некорректные ответы API укажут на проблемный участок.

Пошаговое решение автоматической удалённой отгрузки и синхронизации остатков

1. Настройка вебхука для получения уведомлений об отгрузке

Создайте вебхук в вашей системе складского учёта, который отправляет POST-запрос на ваш WordPress-сайт при изменении статуса заказа или отгрузки.

В WordPress добавьте endpoint для приёма данных. В functions.php вашей темы или в кастомном плагине:

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/update-stock', array(
        'methods' => 'POST',
        'callback' => 'handle_stock_update',
        'permission_callback' => '__return_true',
    ));
});

function handle_stock_update(WP_REST_Request $request) {
    $params = $request->get_json_params();
    if (empty($params['sku']) || !isset($params['quantity'])) {
        return new WP_REST_Response(['error' => 'Invalid parameters'], 400);
    }

    $product_id = wc_get_product_id_by_sku($params['sku']);
    if (!$product_id) {
        return new WP_REST_Response(['error' => 'Product not found'], 404);
    }

    $product = wc_get_product($product_id);
    $new_stock = max(0, intval($params['quantity']));
    $product->set_stock_quantity($new_stock);
    $product->save();

    return new WP_REST_Response(['success' => true, 'stock' => $new_stock], 200);
}

2. Автоматическое обновление статуса заказа по отгрузке

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

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/update-order-status', array(
        'methods' => 'POST',
        'callback' => 'handle_order_status_update',
        'permission_callback' => '__return_true',
    ));
});

function handle_order_status_update(WP_REST_Request $request) {
    $params = $request->get_json_params();
    if (empty($params['order_id']) || empty($params['status'])) {
        return new WP_REST_Response(['error' => 'Invalid parameters'], 400);
    }

    $order = wc_get_order($params['order_id']);
    if (!$order) {
        return new WP_REST_Response(['error' => 'Order not found'], 404);
    }

    $allowed_statuses = array('processing', 'completed', 'cancelled', 'refunded');
    if (!in_array($params['status'], $allowed_statuses)) {
        return new WP_REST_Response(['error' => 'Invalid status'], 400);
    }

    $order->update_status($params['status'], 'Статус обновлен удалённой системой.', true);
    return new WP_REST_Response(['success' => true, 'status' => $params['status']], 200);
}

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

  • Отправьте тестовый POST-запрос на endpoint /wp-json/custom/v1/update-stock с JSON, например: {"sku":"product-sku-123", "quantity":10}.
  • Проверьте в админке WooCommerce, что у товара с указанным SKU обновилось количество на складе.
  • Отправьте тестовый POST-запрос на /wp-json/custom/v1/update-order-status с JSON {"order_id":123, "status":"completed"} и убедитесь, что статус заказа изменился.
  • Проверьте логи сервера и WooCommerce на отсутствие ошибок.

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

  • Ошибка 404 при поиске товара по SKU: Убедитесь, что SKU действительно указан у товара и вызывается функция wc_get_product_id_by_sku().
  • Webhook не доходит до сайта: Проверьте доступность REST API, отключите защиту Cloudflare или другие firewall, которые могут блокировать запросы.
  • Отсутствие прав на изменение заказов и товаров: Поскольку endpoint не требует авторизации (permission_callback = __return_true), убедитесь, что URL не доступен посторонним (для защиты сделайте авторизацию по ключу или IP).
  • Неправильные статусы заказов: Используйте только статусы, поддерживаемые WooCommerce, иначе обновление не сработает.

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

  • Добавьте проверку секретного ключа в заголовках или параметрах запроса, чтобы ограничить доступ к REST API.
  • Кэшируйте данные товаров в памяти, если частые запросы приходят на одни и те же SKU.
  • Используйте транзакции базы данных, если обновляете сразу много товаров, чтобы избежать рассинхронизации.
  • Регулярно проверяйте логи и настраивайте оповещения о неудачных попытках синхронизации.
  • Если у вас большой каталог, рассмотрите использование WP CLI для массовых обновлений остатков вне HTTP-запросов.

Сравнение методов синхронизации остатков товаров

МетодПреимуществаНедостаткиКомпромисс
REST API с вебхукамиАвтоматизация, гибкость, мгновенное обновлениеТребует настроек безопасности и стабильного соединенияДобавить авторизацию и логирование
Периодический cron-скриптСтабильность, меньше нагрузка на сервераОбновления с задержкой, не подходит для срочных измененийКомбинировать с уведомлениями о критических изменениях
Ручное обновление через админкуПростота, контрольТрудозатратно, риск ошибокИспользовать как резервный способ
Создание динамического фильтрованного списка постов в WordPress
28.02.2026
WooCommerce: как автоматически удалять зависшие вариации товаров через базу данных и код
08.06.2026
WooCommerce: решение проблем с массовым изменением остатков товара и синхронизацией
16.05.2026
Как использовать WPCommunity для создания сообществ в WordPress
02.04.2026
Как избежать проблем с разрешениями файлов в WordPress
30.03.2026