Проблема: устаревшие остатки товаров в WooCommerce при интеграции с внешними системами
Часто магазины на WooCommerce сталкиваются с ситуацией, когда остатки товаров не синхронизируются с системой учёта или складом. Это приводит к продаже отсутствующих позиций, негативному опыту покупателей и дополнительной ручной работе.
Задача — настроить автоматическое обновление количества товаров (stock quantity) в WooCommerce через REST API, чтобы остатки всегда соответствовали реальному состоянию на складе.
Диагностика проблемы
Для начала проверьте, как сейчас обновляются остатки:
- Используется ли сторонний плагин интеграции?
- Есть ли доступ к API вашего складского ПО?
- Проверены ли права доступа REST API WordPress (OAuth или ключи)?
- Как часто обновляются данные и какие ошибки есть в логах сервера?
Если обновление происходит вручную или нерегулярно, значит автоматизация отсутствует. Если есть ошибки 401, 403 или 404 при запросах, возможен неверный ключ или неправильный эндпоинт.
Пошаговое решение: создание скрипта для автоматического обновления остатков товаров через REST API WooCommerce
1. Подготовка API доступа
В админке WooCommerce перейдите WooCommerce > Настройки > Продвинутые > REST API и создайте нового пользователя с правами на чтение и запись. Сохраните Consumer Key и Consumer Secret.
2. Получение данных с внешнего склада
Предположим, внешний склад предоставляет JSON с товарами и их остатками по SKU:
[
{"sku": "product-123", "stock_quantity": 10},
{"sku": "product-456", "stock_quantity": 0},
...
]3. Написание PHP-скрипта для обновления остатков
Создайте отдельный PHP-скрипт в корне сайта или в отдельном плагине, например update-stock.php:
<?php
require_once 'wp-load.php';
// Параметры WooCommerce REST API
$consumer_key = 'ck_xxxxx';
$consumer_secret = 'cs_xxxxx';
$store_url = 'https://example.com';
// Получаем данные склада
$stock_data = file_get_contents('https://external-warehouse/api/stock');
$stock_data = json_decode($stock_data, true);
if (!is_array($stock_data)) {
error_log('Ошибка получения данных склада');
exit;
}
foreach ($stock_data as $item) {
$sku = $item['sku'];
$stock_quantity = (int) $item['stock_quantity'];
// Получаем ID товара по SKU
$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) {
error_log("Не удалось получить объект товара с ID $product_id");
continue;
}
// Обновляем остаток
$product->set_stock_quantity($stock_quantity);
$product->set_stock_status($stock_quantity > 0 ? 'instock' : 'outofstock');
$product->save();
}
echo 'Обновление остатков завершено';
?>Этот скрипт загружает остатки, ищет товар по SKU, обновляет количество и статус наличия.
4. Автоматизация запуска скрипта через WP-Cron
Добавьте в functions.php темы или в плагин следующий код для регулярного обновления:
if (!wp_next_scheduled('update_woocommerce_stock_hook')) {
wp_schedule_event(time(), 'hourly', 'update_woocommerce_stock_hook');
}
add_action('update_woocommerce_stock_hook', 'update_woocommerce_stock_function');
function update_woocommerce_stock_function() {
include_once ABSPATH . 'update-stock.php';
}Это запустит обновление раз в час. Можно настроить интервал по необходимости.
Проверка результата после внедрения
- В админке WooCommerce проверьте остатки товаров — они должны соответствовать данным склада.
- В логах сервера (error_log) не должно быть ошибок по обновлению.
- Выполните запрос к API склада вручную и сравните с остатками через WP-админку.
Частые ошибки и их исправление
- Товар не найден по SKU — убедитесь, что SKU в WooCommerce совпадают с SKU из внешнего источника, без лишних пробелов.
- Ошибка 401/403 при использовании REST API — проверьте права пользователя и корректность ключей Consumer Key и Secret.
- Скрипт не запускается по расписанию — проверьте, работает ли WP-Cron. Если сайт не посещается регулярно, настройте системный cron.
- Обновление не сохраняется — убедитесь, что WooCommerce активен и функции wc_get_product_id_by_sku и wc_get_product доступны.
Практические советы по безопасности и производительности
- Не храните ключи REST API в открытом виде, используйте защищённые переменные окружения или wp-config.php.
- Используйте nonce и проверку прав пользователя, если вызываете скрипт через веб.
- Для больших каталогов запускайте обновление партиями, чтобы избежать таймаутов.
- Записывайте успешные обновления и ошибки в отдельный лог-файл для анализа.
Сравнение вариантов обновления остатков товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Сторонний плагин | Быстрая настройка, поддержка разработчика, UI | Зависимость от плагина, возможные конфликты, оплата |
| Кастомный PHP-скрипт (REST API WooCommerce) | Полный контроль, гибкость, отсутствие лишних функций | Нужны знания программирования, ручная настройка |
| Вебхуки и интеграция со складом | Реальное время обновления, автоматизация | Сложность настройки, необходимость поддержки |