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