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

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

Частая задача при управлении интернет-магазином на WooCommerce — автоматическое обновление складских остатков при изменениях в сторонней системе учёта (ERP, 1С, CRM). Без синхронизации вручную обновлять запасы сложно и рискованно, особенно при большом ассортименте.

Проверьте, есть ли у вас:

  • Доступ к API внешней системы с актуальными данными по складу;
  • Понимание формата данных (JSON, XML и т. п.);
  • Возможность запускать периодические задачи (cron) на сервере;
  • Включённый учёт запасов в WooCommerce (WooCommerce → Настройки → Товары → Управление запасами).

Пошаговое решение: настройка автоматической синхронизации остатков с внешним API

1. Создание функции для получения данных с API

Напишем функцию, которая обращается к внешнему API и получает актуальные остатки. В этом примере API возвращает JSON с массивом товаров, где sku — артикул, stock_quantity — количество на складе.

function get_external_inventory_data() {
    $response = wp_remote_get('https://external-api.example.com/inventory');
    if (is_wp_error($response)) {
        return false;
    }
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        return false;
    }
    return $data;
}

2. Обновление запасов товаров WooCommerce по SKU

Создадим функцию, которая по данным из API обновит количество товаров в WooCommerce. Используем метод wc_get_product_id_by_sku() для поиска товара по артикулу.

function update_woocommerce_stock() {
    $inventory = get_external_inventory_data();
    if (!$inventory) {
        error_log('Ошибка получения данных инвентаря');
        return;
    }

    foreach ($inventory as $item) {
        if (empty($item['sku']) || !isset($item['stock_quantity'])) {
            continue;
        }

        $product_id = wc_get_product_id_by_sku($item['sku']);
        if (!$product_id) {
            continue; // Товар не найден
        }

        $product = wc_get_product($product_id);
        if (!$product) {
            continue;
        }

        // Обновляем количество на складе
        $product->set_stock_quantity(intval($item['stock_quantity']));
        $product->set_stock_status($item['stock_quantity'] > 0 ? 'instock' : 'outofstock');
        $product->save();
    }
}

3. Настройка планировщика задач (WP-Cron) для автоматизации

Добавим событие, которое будет запускать обновление запасов, например, раз в час.

function schedule_stock_sync() {
    if (!wp_next_scheduled('sync_woocommerce_stock_event')) {
        wp_schedule_event(time(), 'hourly', 'sync_woocommerce_stock_event');
    }
}
add_action('wp', 'schedule_stock_sync');

add_action('sync_woocommerce_stock_event', 'update_woocommerce_stock');

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

  • Войдите в админку WooCommerce → Товары и выберите товар с известным артикулом (SKU), который есть в API.
  • Проверьте поле «Количество на складе» — оно должно соответствовать данным из внешнего API.
  • Если вы добавляете error_log в функцию, проверьте файл debug.log на наличие ошибок получения данных.
  • Для ручного запуска можно вызвать update_woocommerce_stock() из консоли WP-CLI или временно подключить вызов на странице администратора.

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

  • Ошибка: данные API не загружаются (wp_remote_get возвращает ошибку)
    Проверьте URL, доступность API, наличие SSL-сертификата, настройки хостинга (firewall, блокировка внешних запросов).
  • Неверный формат данных в API
    Проверьте, что API возвращает валидный JSON. Для отладки добавьте вывод var_dump($body) или логи.
  • Товар не найден по SKU
    Проверьте, что SKU в WooCommerce совпадает с тем, что приходит из API. SKU чувствительны к регистру и пробелам.
  • Запасы не обновляются
    Убедитесь, что учёт запасов включён в настройках WooCommerce и что вызывается $product->save().
  • WP-Cron не запускается
    Проверьте, что на сайте посещения для срабатывания WP-Cron или настройте системный cron для запуска wp cron event run --due-now.

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

  • Безопасность API: если API требует авторизации, используйте безопасное хранение ключей (например, в wp-config.php) и передавайте их в заголовках запроса.
  • Ограничение количества запросов: если API имеет лимиты, настраивайте WP-Cron с нужным интервалом, чтобы не превысить их.
  • Логирование ошибок: включайте логирование, чтобы быстро выявлять сбои в синхронизации.
  • Оптимизация обновлений: можно дополнительно сравнивать текущие и новые остатки, чтобы обновлять только изменившиеся товары и снизить нагрузку.

Таблица сравнения способов синхронизации остатков

МетодПлюсыМинусы
Плагин синхронизацииГотовое решение, поддержка, UIСтоимость, ограниченная кастомизация
Собственная реализация через WP-Cron + APIПолный контроль, бесплатное решениеТребует навыков разработки, поддержка на владельце сайта
Ручное обновление CSVПросто в реализацииТребует ручных действий, риск ошибок
Как автоматизировать создание и удаление черновиков в WordPress
26.03.2026
Как создать собственный shortcode в WordPress
06.11.2025
Как использовать WPCommunity для создания форума на WordPress
23.02.2026
Как добавить поддержку JSON-LD в WordPress
25.11.2025
Как использовать хуки в WordPress для расширения функциональности
17.11.2025