Диагностика задачи: зачем автоматизировать обновление товаров в WooCommerce через CSV
Часто интернет-магазины на WooCommerce получают прайс-листы и остатки товаров от поставщиков в формате CSV. Ручное обновление товаров — затратный и ошибкоопасный процесс. Задача — автоматизировать импорт, чтобы при загрузке CSV автоматически обновлялись цены и количество товаров, а новые позиции добавлялись без дублирования.
Проверяем исходные данные: CSV должен содержать уникальный идентификатор товара (обычно артикул или SKU), цена и количество. Без уникального идентификатора сопоставить товар не получится.
Пошаговое решение: как программно обновлять инвентарь и цены из CSV в WooCommerce
1. Подготовка CSV и загрузка файла
Сохраняйте CSV в UTF-8 и проверяйте разделители (запятые или точки с запятой). Для теста можно использовать минимальный файл с 3 колонками: SKU, price, stock.
2. Парсинг CSV и сопоставление товаров
Используем стандартные функции PHP для чтения CSV и WP_Query для поиска товаров по SKU.
function wc_update_products_from_csv($csv_path) {
if (!file_exists($csv_path)) {
return 'Файл не найден';
}
if (($handle = fopen($csv_path, 'r')) === false) {
return 'Не удалось открыть файл';
}
$header = fgetcsv($handle);
$updated = 0;
while (($row = fgetcsv($handle)) !== false) {
$data = array_combine($header, $row);
if (empty($data['SKU'])) {
continue; // Пропускаем строки без SKU
}
$product_id = wc_get_product_id_by_sku($data['SKU']);
if (!$product_id) {
// Можно добавить создание товара здесь
continue;
}
$product = wc_get_product($product_id);
// Обновим цену
if (isset($data['price'])) {
$product->set_regular_price($data['price']);
}
// Обновим количество
if (isset($data['stock'])) {
$product->set_stock_quantity($data['stock']);
$product->set_manage_stock(true);
}
$product->save();
$updated++;
}
fclose($handle);
return "Обновлено товаров: $updated";
}
// Функция для поиска ID продукта по SKU
function wc_get_product_id_by_sku($sku) {
global $wpdb;
return $wpdb->get_var($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value=%s LIMIT 1",
$sku
));
}
3. Запуск скрипта и интеграция с админкой
Можно добавить административную страницу с формой загрузки CSV и запуском импорта через AJAX или напрямую из админки. Для теста вызывайте функцию с абсолютным путем к файлу.
Проверка результата после внедрения
1. Проверьте логи ошибок PHP — не должно быть предупреждений.
2. Зайдите в карточки товаров, которые были в CSV, и убедитесь, что цены и остатки обновились.
3. Если использовали кэширование WooCommerce или плагинов, очистите кэш.
4. Для отладки можно добавить вывод количества обновленных товаров и ошибок в лог.
Частые ошибки и способы их исправления
- Проблемы с кодировкой CSV: используйте UTF-8 без BOM, иначе могут быть ошибки при чтении.
- Не найден SKU: убедитесь, что SKU в CSV и в товарах совпадают по регистру и формату.
- Права доступа к файлу: файл CSV должен быть доступен для чтения PHP-скриптом.
- Не обновляются данные: проверьте наличие вызова
$product->save();после изменения свойств. - Создание новых товаров: если требуется, добавьте логику создания постов типа product, иначе пропускаются.
Практические советы по безопасности и производительности
- Загружайте CSV только с админки, ограничьте доступ по ролям.
- Перед обработкой делайте копию базы или экспорт товаров для отката.
- Для больших CSV обрабатывайте файл по частям (batch processing), чтобы избежать таймаутов и превышения памяти.
- Отключайте кэширование на время импорта, чтобы изменения сразу отображались.
- Используйте транзакции базы данных или WP-CLI для надежности при массовом обновлении.
Сравнение подходов: плагин vs собственный код
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин импорта CSV (например, WP All Import) | Простота настройки, визуальный интерфейс, поддержка сложных сценариев | Платные версии, нагрузка на сайт, ограниченная гибкость в кастомных задачах |
| Собственный код | Точная настройка под бизнес-процесс, легковесность, контроль над логикой | Требует навыков PHP, поддержка и доработка своими силами |