Диагностика проблемы с синхронизацией остатков в WooCommerce
При работе с большим ассортиментом товаров и несколькими точками продаж часто возникает задача автоматической синхронизации остатков между WooCommerce и удалённой системой складского учёта или поставщиком. Проблемы проявляются в несоответствии остатков, задержках обновления, дублировании данных или конфликте при массовых изменениях.
Чтобы точно определить проблему, проверьте следующие моменты:
- Последнее время обновления остатков в WooCommerce и в удалённой системе.
- Логи ошибок в WooCommerce и серверные логи API-запросов.
- Корректность настроек cron-задач, отвечающих за синхронизацию.
- Правильность обработки ответов от удалённого API, особенно статусов ошибок.
Как проверить текущий статус синхронизации
Для оценки актуальности остатков выполните простой запрос к базе WooCommerce:
SELECT product_id, stock_quantity FROM wp_wc_product_meta_lookup WHERE stock_quantity <= 0;И сравните с данными удалённой системы. Если различия значительные, значит синхронизация работает некорректно.
Пошаговое решение: реализация автоматической удалённой отгрузки и синхронизация остатков
1. Создание cron-задачи для регулярного обновления
Добавьте в functions.php или отдельный плагин код для регистрации события cron и его обработки:
if (!wp_next_scheduled('custom_sync_stock_cron')) {
wp_schedule_event(time(), 'hourly', 'custom_sync_stock_cron');
}
add_action('custom_sync_stock_cron', 'custom_sync_stock_with_remote');
function custom_sync_stock_with_remote() {
$products = wc_get_products(array('limit' => -1));
foreach ($products as $product) {
$remote_stock = get_remote_stock($product->get_sku());
if ($remote_stock !== null) {
$product->set_stock_quantity($remote_stock);
$product->save();
}
}
}
function get_remote_stock($sku) {
$api_url = 'https://remote.api.example.com/stock?sku=' . urlencode($sku);
$response = wp_remote_get($api_url, array('timeout' => 10));
if (is_wp_error($response)) {
error_log('Ошибка запроса остатка для SKU ' . $sku);
return null;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (isset($data['stock'])) {
return intval($data['stock']);
}
return null;
}2. Автоматическая отгрузка заказов через API удалённого склада
При смене статуса заказа на "Выполнен" нужно отправлять данные о заказе на удалённый склад:
add_action('woocommerce_order_status_completed', 'send_order_to_remote_warehouse', 10, 1);
function send_order_to_remote_warehouse($order_id) {
$order = wc_get_order($order_id);
$items = array();
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$items[] = [
'sku' => $product->get_sku(),
'quantity' => $item->get_quantity(),
];
}
$data = [
'order_id' => $order_id,
'items' => $items,
'customer' => [
'email' => $order->get_billing_email(),
'phone' => $order->get_billing_phone(),
],
];
$response = wp_remote_post('https://remote.api.example.com/shipments', [
'body' => json_encode($data),
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
],
'timeout' => 15,
]);
if (is_wp_error($response)) {
error_log('Ошибка отправки заказа ' . $order_id);
}
}Проверка результата после внедрения
1. Проверьте логи ошибок (wp-content/debug.log или через error_log) — отсутствие ошибок при cron и API-запросах.
2. Сравните остатки товаров в WooCommerce и удалённой системе через SQL запрос и API.
3. Совершите тестовый заказ, переведите его в статус «Выполнен» и убедитесь, что данные отправились успешно (проверка лога или отклика API).
Частые ошибки и как их исправить
- Отсутствие cron-задачи: Используйте плагин WP Crontrol для проверки и запуска задач вручную.
- Неправильный формат данных API: Проверьте документацию API удалённой системы, используйте json_encode/json_decode с флагами.
- Проблемы с авторизацией: Токен API может истечь — настройте обновление и хранение в защищённых опциях.
- Проблемы с таймаутом: Увеличьте таймаут в wp_remote_get/wp_remote_post, особенно при большом объёме данных.
Практические советы по безопасности и производительности
- Для API-запросов используйте HTTPS и корректно храните API-ключи в
wp-config.phpили черезadd_optionс ограниченным доступом. - Оптимизируйте количество продуктов в одной синхронизации, чтобы не перегружать сервер (пагинация или пакетная обработка).
- Добавьте обработку ошибок и повторные попытки при неудачных запросах с экспоненциальной задержкой.
- Отключите вывод ошибок в продакшене, чтобы не раскрывать детали реализации.
Сравнение способов синхронизации остатков
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| WP Cron + wp_remote_get/post | Гибкость, полный контроль, без сторонних плагинов | Зависит от посещаемости сайта, требует отладки | Код выше |
| Плагины синхронизации (например WP All Import) | Простота настройки, визуальный интерфейс | Ограниченная кастомизация, стоимость | Clearfy Pro (есть модули для SEO и оптимизации, но не для складской синхронизации) |