Диагностика проблемы: почему стандартный импорт WooCommerce не подходит для автоматического обновления цен и остатков
Базовый импорт товаров через встроенный инструмент WooCommerce или сторонние плагины часто не обновляет цены и остатки корректно, если товары уже есть в базе. Обычно импорт добавляет новые товары или обновляет только часть данных, а цены и остатки остаются без изменений. Это приводит к расхождению данных между поставщиком и вашим магазином и требует ручного вмешательства.
Типичные симптомы:
- Цены не меняются после повторного импорта CSV с обновлёнными ценами.
- Остатки товаров не обновляются, даже если в CSV указаны новые значения.
- Импорт создаёт дубли товаров, а не обновляет существующие.
Пошаговое решение: программное обновление цен и остатков при импорте CSV
1. Подключение и чтение CSV файла
Для автоматизации используем PHP-код, который читает CSV и обновляет товары по SKU, поскольку это уникальный идентификатор. Хорошая практика — проверять наличие обязательных колонок sku, price, stock.
function update_products_from_csv($csv_path) {
if (!file_exists($csv_path)) {
error_log('CSV файл не найден: '.$csv_path);
return;
}
if (($handle = fopen($csv_path, 'r')) === false) {
error_log('Не удалось открыть CSV файл');
return;
}
$header = fgetcsv($handle);
if (!$header) {
error_log('CSV файл пустой');
fclose($handle);
return;
}
$required_columns = ['sku', 'price', 'stock'];
foreach ($required_columns as $col) {
if (!in_array($col, $header)) {
error_log('Отсутствует обязательная колонка: '.$col);
fclose($handle);
return;
}
}
$data = [];
while (($row = fgetcsv($handle)) !== false) {
$data[] = array_combine($header, $row);
}
fclose($handle);
return $data;
}2. Обновление товаров по SKU
Далее для каждого товара ищем пост типа product с нужным sku и обновляем мета-данные цены и остатка.
function update_product_price_and_stock($sku, $price, $stock) {
$product_id = wc_get_product_id_by_sku($sku);
if (!$product_id) {
error_log('Товар с SKU '.$sku.' не найден');
return;
}
$product = wc_get_product($product_id);
if (!$product) {
error_log('Ошибка получения объекта товара с ID '.$product_id);
return;
}
// Обновляем цену
$product->set_price($price);
$product->set_regular_price($price);
$product->save();
// Обновляем остаток
wc_update_product_stock($product, $stock);
}3. Запуск обновления по всему файлу
$csv_data = update_products_from_csv('/path/to/file.csv');
if ($csv_data) {
foreach ($csv_data as $item) {
update_product_price_and_stock($item['sku'], $item['price'], $item['stock']);
}
}Как проверить, что цены и остатки обновились
- В админке WooCommerce откройте карточку товара по SKU и убедитесь, что цена и запас совпадают с CSV.
- Через SQL:
SELECT meta_value FROM wp_postmeta WHERE post_id = [ID_товара] AND meta_key IN ('_price', '_stock'); - Выведите данные на фронте или через REST API, чтобы убедиться в актуальности.
Частые ошибки и как их устранить
- Товары не обновляются: проверьте, что SKU уникален и совпадает с тем, что в CSV. Используйте функцию
wc_get_product_id_by_sku, она возвращает 0, если товар не найден. - Неверный формат CSV: убедитесь, что CSV кодирован в UTF-8 и разделители — запятые. Ошибки парсинга приводят к пустым или неправильным данным.
- Проблемы с правами на файл: скрипт должен иметь доступ на чтение файла CSV.
- Кэширование: очистите кэш WooCommerce и сторонних плагинов после обновления, чтобы изменения отобразились.
Практические советы по безопасности и производительности
- Запускайте импорт в фоне, чтобы не блокировать сайт, например, через WP-Cron или CLI.
- Ограничьте размер CSV-файлов и разбивайте большие файлы на части, чтобы избежать превышения лимитов памяти.
- Используйте nonce и права пользователя при запуске функции обновления из админки.
- Логируйте ошибки в отдельный файл для последующего анализа.
Сравнение подходов: плагин vs код vs ручной импорт
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Плагин импорта CSV (например, WP All Import) | Удобный интерфейс, поддержка сложных полей | Платные версии, нагрузка на сайт | Когда нужны гибкие настройки и нет желания писать код |
| Собственный PHP-код (как в статье) | Максимальный контроль, можно адаптировать под задачи | Требует разработки и тестирования | Для автоматизации и интеграции в сложные сценарии |
| Ручной импорт через WooCommerce | Простота, нет затрат | Не обновляет цены и остатки автоматически | Для разовых обновлений небольших каталогов |