Диагностика проблемы: почему складские остатки не синхронизируются автоматически
Частая задача при управлении интернет-магазином на 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 | Просто в реализации | Требует ручных действий, риск ошибок |