Диагностика проблемы: почему остатки товаров не синхронизируются
В случае ведения нескольких сайтов на WordPress с WooCommerce одной из частых задач является синхронизация остатков товаров между площадками. Без автоматизации часто возникает рассинхронизация: продажи на одном сайте не отражаются на остатках другого, что приводит к ошибочным заказам и неудовлетворённости клиентов.
Типичные причины проблемы:
- Отсутствие единого источника данных для остатков;
- Ручное обновление остатков, не учитывающее продажи на других площадках;
- Отсутствие настроенного обмена данными через API между сайтами;
- Разные версии WooCommerce или несовместимые настройки REST API.
Пошаговое решение: синхронизация остатков товаров с помощью REST API WooCommerce
1. Включение REST API и создание ключей доступа
На каждом сайте необходимо включить REST API и создать ключи с правами чтения и записи. Для этого:
- В админке WordPress перейдите в WooCommerce > Настройки > Расширенные > REST API.
- Добавьте ключ с описанием, выберите пользователя и установите права
Read/Write. - Сохраните ключи Consumer Key и Consumer Secret.
2. Получение остатков с источника и обновление на целевом сайте
Используем PHP-скрипт для извлечения информации о товарах с одного сайта и обновления остатков товаров на другом.
<?php
// Параметры API источника
$source_url = 'https://source-site.com/wp-json/wc/v3/products';
$consumer_key = 'ck_XXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$consumer_secret = 'cs_XXXXXXXXXXXXXXXXXXXXXXXXXXXX';
// Параметры API целевого сайта
$target_url = 'https://target-site.com/wp-json/wc/v3/products/';
$target_consumer_key = 'ck_YYYYYYYYYYYYYYYYYYYYYYYYYYYY';
$target_consumer_secret = 'cs_YYYYYYYYYYYYYYYYYYYYYYYYYYYY';
// Получаем список товаров с источника
$response = wp_remote_get($source_url . '?consumer_key=' . $consumer_key . '&consumer_secret=' . $consumer_secret);
if (is_wp_error($response)) {
die('Ошибка при запросе к API источника');
}
$products = json_decode(wp_remote_retrieve_body($response), true);
foreach ($products as $product) {
$product_id = $product['id'];
$stock_quantity = $product['stock_quantity'];
// Формируем данные для обновления
$data = json_encode(['stock_quantity' => $stock_quantity]);
// Обновляем остаток на целевом сайте
$ch = curl_init($target_url . $product_id);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $target_consumer_key . ':' . $target_consumer_secret);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$result = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code !== 200) {
error_log('Ошибка обновления товара ID ' . $product_id . ': ' . $result);
}
}
?>Проверка результата после внедрения
Для проверки корректности синхронизации:
- Создайте тестовый заказ на одном сайте, уменьшив остаток товара.
- Запустите скрипт синхронизации (выше) или настройте планировщик (cron) для автоматического запуска.
- Проверьте, что остаток товара на втором сайте уменьшился в соответствии с заказом.
- В админке WooCommerce обоих сайтов убедитесь, что значения совпадают.
Частые ошибки и как их исправить
- Ошибка 401 Unauthorized — неверные ключи REST API или недостаточно прав. Проверьте права пользователя, создайте новые ключи.
- Ошибка 404 Not Found — неверный URL API. Проверьте правильность пути
/wp-json/wc/v3/products. - Несовпадение ID товаров — ID продуктов на разных сайтах отличаются, поэтому по ним нельзя обновить остаток. Используйте SKU для сопоставления (требует доработки скрипта).
- Отсутствие stock_quantity в ответе API — проверьте, что в настройках продуктов включён учёт остатков.
Практические советы по безопасности и производительности
- Храните ключи Consumer Key и Secret в защищённых файлах вне публичного доступа.
- Ограничьте IP-адреса, с которых разрешён доступ к REST API, если возможно.
- Для большого каталога используйте пакетную обработку или WP-CLI для уменьшения нагрузки.
- Обрабатывайте ошибки API и логируйте неудачные обновления для последующего анализа.
Сравнение вариантов синхронизации остатков WooCommerce
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| REST API (код) | Гибкость, интеграция без плагинов | Требует знаний PHP и API | Для разработчиков и кастомных интеграций |
| Плагины синхронизации | Простота установки, готовые решения | Может нагружать сайт, ограничена функциональность | Для быстрого запуска и без разработки |
| Базы данных и репликация | Максимальная скорость, централизованный учет | Сложность настройки, требует сервера с доступом к БД | Для крупных проектов с единым складом |