Автоматическое обновление остатков товаров WooCommerce по API

Проблема: как автоматически обновлять остатки товаров в WooCommerce из внешней системы

В интернет-магазинах на WooCommerce часто возникает задача синхронизировать остатки товаров с внешними учетными системами — 1С, ERP, складскими программами. Ручное обновление неудобно и приводит к ошибкам. В статье разберем, как настроить автоматическое обновление остатков по API, используя собственный скрипт и встроенные средства WooCommerce.

Диагностика проблемы

Перед реализацией решения нужно понять:

  • Каким образом внешняя система предоставляет данные: REST API, выгрузка CSV или другой формат?
  • В каком формате приходят идентификаторы товаров: SKU, ID, артикул?
  • Как часто нужно обновлять остатки: по расписанию или по событию?
  • Есть ли ограничения по времени выполнения скриптов на хостинге?

Для проверки работоспособности API используйте curl или Postman, чтобы убедиться, что получаете актуальные данные.

Пошаговое решение: автоматизация обновления остатков

1. Получение данных из внешнего API

Пример запроса к внешнему REST API с использованием wp_remote_get:

function get_external_stock_data() {
    $response = wp_remote_get('https://external-api.example.com/stocks', [
        'headers' => [
            'Authorization' => 'Bearer your_api_token_here'
        ]
    ]);
    if (is_wp_error($response)) {
        error_log('Ошибка запроса к API: ' . $response->get_error_message());
        return [];
    }
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        error_log('Ошибка декодирования JSON: ' . json_last_error_msg());
        return [];
    }
    return $data;
}

2. Обновление остатков товаров в WooCommerce

Пример функции обновления остатков по SKU:

function update_woocommerce_stock($stock_data) {
    foreach ($stock_data as $item) {
        $sku = $item['sku'];
        $stock_quantity = intval($item['quantity']);

        $product_id = wc_get_product_id_by_sku($sku);
        if (!$product_id) {
            error_log('Товар с SKU ' . $sku . ' не найден');
            continue;
        }

        $product = wc_get_product($product_id);
        if ($product) {
            $product->set_stock_quantity($stock_quantity);
            $product->set_stock_status($stock_quantity > 0 ? 'instock' : 'outofstock');
            $product->save();
        }
    }
}

3. Автоматический запуск обновления по расписанию

Используем WP-Cron для регулярного обновления. Добавьте в functions.php или в плагин:

if (!wp_next_scheduled('update_stock_cron_hook')) {
    wp_schedule_event(time(), 'hourly', 'update_stock_cron_hook');
}

add_action('update_stock_cron_hook', function() {
    $stock_data = get_external_stock_data();
    if (!empty($stock_data)) {
        update_woocommerce_stock($stock_data);
    }
});

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

  • Проверьте лог ошибок PHP для сообщений об ошибках при запросе API или обновлении товаров.
  • Сравните остатки товаров в WooCommerce с данными из внешней системы.
  • Запустите вручную функцию обновления (через WP CLI или временный вызов) для проверки корректности обработки данных.
  • Проверьте, что при изменении остатка меняется статус товара (в наличии/нет в наличии) на фронтенде.

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

  • Ошибка: Товар не найден по SKU. Причина — не совпадает формат SKU или товар отсутствует. Проверьте, что SKU в WooCommerce совпадает с API, используйте wc_get_product_id_by_sku().
  • Проблемы с таймаутом при запросе API. Увеличьте таймаут в wp_remote_get, проверьте скорость отклика внешнего сервера.
  • WP-Cron не срабатывает. На некоторых хостингах WP-Cron требует внешних запросов. Настройте системный cron или используйте плагин для надежного запуска задач.
  • Ошибки JSON-парсинга. Убедитесь, что API возвращает корректный JSON, проверьте кодировку и корректность данных.

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

  • Используйте авторизацию и шифрование при запросах к внешнему API.
  • Кешируйте результаты API, если данные не требуют моментального обновления, чтобы снизить нагрузку.
  • Обрабатывайте исключения и ошибки, чтобы не останавливать выполнение скрипта.
  • Следите за размером данных: при большом количестве товаров реализуйте обновление пакетами с помощью offset и limit.

Сравнение вариантов обновления остатков

МетодПлюсыМинусы
Плагин синхронизации WooCommerceПростота настройки, поддержка разработчикаЧасто платные, ограниченная кастомизация
Собственный скрипт на PHP + WP-CronГибкость, полный контроль, бесплатностьТребует навыков разработки, поддержка на стороне пользователя
Ручной импорт CSVПростота, подходит для разовых обновленийНе подходит для автоматизации и больших каталогов
⭐⭐⭐⭐⭐