Диагностика задачи: зачем автоматизировать импорт товаров в WooCommerce
При большом ассортименте товаров ручное добавление каждой позиции в WooCommerce занимает много времени и приводит к ошибкам. Особенно это актуально для магазинов с часто меняющимся ассортиментом или поставщиков, предоставляющих каталоги в формате CSV. Автоматизация импорта товаров позволяет сэкономить время и снизить число ошибок.
Подготовка CSV файла для импорта
Для успешного импорта важно правильно структурировать CSV файл с товарами. Минимальный набор колонок для простых товаров:
post_title— название товара;post_content— описание;sku— уникальный артикул;regular_price— цена;stock— наличие (число илиinstock/outofstock);categories— категории через запятую;images— ссылки на изображения через запятую.
Для вариативных товаров добавляются колонки с атрибутами, но в этой статье рассмотрим простой импорт.
Пошаговое решение: импорт товаров через WP CLI с кастомным скриптом
1. Создание PHP скрипта для импорта CSV
Создайте файл import-products.php в корне сайта с таким содержимым:
<?php
// Загрузка WordPress
require_once 'wp-load.php';
function import_products_from_csv($csv_file) {
if (!file_exists($csv_file)) {
echo "CSV файл не найден\n";
return;
}
$row = 0;
if (($handle = fopen($csv_file, 'r')) !== false) {
$header = fgetcsv($handle, 1000, ',');
while (($data = fgetcsv($handle, 1000, ',')) !== false) {
$row++;
$product_data = array_combine($header, $data);
// Проверка обязательных полей
if (empty($product_data['post_title']) || empty($product_data['regular_price'])) {
echo "Пропущена строка $row: нет названия или цены\n";
continue;
}
// Проверяем, есть ли товар с таким SKU
$existing_id = wc_get_product_id_by_sku($product_data['sku']);
if ($existing_id) {
echo "Товар с SKU {$product_data['sku']} уже существует (ID: $existing_id), пропускаем\n";
continue;
}
// Создаем продукт
$post_id = wp_insert_post(array(
'post_title' => $product_data['post_title'],
'post_content' => $product_data['post_content'] ?? '',
'post_status' => 'publish',
'post_type' => 'product',
));
if (is_wp_error($post_id)) {
echo "Ошибка при создании товара на строке $row\n";
continue;
}
// Устанавливаем метаданные
update_post_meta($post_id, '_sku', $product_data['sku']);
update_post_meta($post_id, '_regular_price', $product_data['regular_price']);
update_post_meta($post_id, '_price', $product_data['regular_price']);
// Наличие товара
$stock = $product_data['stock'] ?? '';
if ($stock === '' || strtolower($stock) === 'instock' || intval($stock) > 0) {
update_post_meta($post_id, '_stock_status', 'instock');
update_post_meta($post_id, '_stock', intval($stock) > 0 ? intval($stock) : 10); // 10 по умолчанию
update_post_meta($post_id, '_manage_stock', 'yes');
} else {
update_post_meta($post_id, '_stock_status', 'outofstock');
update_post_meta($post_id, '_manage_stock', 'no');
}
// Категории
if (!empty($product_data['categories'])) {
$categories = array_map('trim', explode(',', $product_data['categories']));
$cat_ids = [];
foreach ($categories as $cat_name) {
$term = term_exists($cat_name, 'product_cat');
if (!$term) {
$term = wp_insert_term($cat_name, 'product_cat');
if (is_wp_error($term)) continue;
$term_id = $term['term_id'];
} else {
$term_id = is_array($term) ? $term['term_id'] : $term;
}
$cat_ids[] = intval($term_id);
}
wp_set_object_terms($post_id, $cat_ids, 'product_cat');
}
// Изображения
if (!empty($product_data['images'])) {
$images = array_map('trim', explode(',', $product_data['images']));
$first_image = array_shift($images);
$attachment_id = import_image_from_url($first_image, $post_id);
if ($attachment_id) {
set_post_thumbnail($post_id, $attachment_id);
}
}
echo "Товар '{$product_data['post_title']}' импортирован (ID: $post_id)\n";
}
fclose($handle);
}
}
function import_image_from_url($image_url, $post_id) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
$tmp = download_url($image_url);
if (is_wp_error($tmp)) {
return false;
}
$file_array = array(
'name' => basename($image_url),
'tmp_name' => $tmp
);
$attachment_id = media_handle_sideload($file_array, $post_id);
if (is_wp_error($attachment_id)) {
@unlink($file_array['tmp_name']);
return false;
}
return $attachment_id;
}
// Запуск импорта с указанием пути к CSV
$csv_path = __DIR__ . '/products.csv';
import_products_from_csv($csv_path);
?>2. Запуск скрипта через WP-CLI
Чтобы импортировать товары, загрузите CSV файл products.csv в корень сайта и выполните в терминале:
wp eval-file import-products.phpЭто запустит импорт и выведет лог по каждой строке.
Проверка результата после импорта
Проверьте в админке WooCommerce:
- В разделе «Товары» появились новые товары с правильными названиями и ценами.
- Есть ли у товаров правильные категории.
- Проверить наличие и отображение миниатюр (установленных изображений).
- Проверьте SKU и наличие через редактирование товара.
Также можно выполнить wp-cli команду для проверки SKU:
wp post list --post_type=product --meta_key=_sku --fields=ID,post_title,_skuЧастые ошибки при автоматическом импорте товаров
- Неверный формат CSV: Нужно обязательно проверить разделители и кодировку (UTF-8 без BOM).
- Отсутствие обязательных полей: Без
post_titleиregular_priceтовар не создастся. - Ошибки загрузки изображений: URL изображения должен быть доступен и корректен, иначе миниатюра не прикрепится.
- SKU дублируется: В WooCommerce SKU должен быть уникальным, дублирование приводит к пропуску товара.
- Права на запись: WordPress должен иметь права на создание постов и загрузку файлов.
Практические советы для производительности и безопасности импорта
- Обрабатывайте импорт партиями: Для больших файлов разбивайте импорт на части, чтобы не превышать лимиты памяти и времени выполнения.
- Выполняйте импорт через WP-CLI: Это надежнее и быстрее, чем через веб-интерфейс.
- Проверяйте данные перед импортом: Используйте валидаторы CSV и фильтры для предотвращения ошибок.
- Ограничьте доступ к скриптам импорта: Запускайте их только локально или через WP-CLI, чтобы избежать внешнего запуска злоумышленниками.
- Резервное копирование: Перед массовым импортом делайте бэкап базы данных.
Сравнение методов импорта товаров в WooCommerce
| Метод | Преимущества | Недостатки | Подходит для |
|---|---|---|---|
| Импорт через WP-CLI + кастомный скрипт | Полный контроль, автоматизация, можно запускать по расписанию | Требует навыков PHP и командной строки | Разработчики, крупные магазины, регулярные обновления |
| Плагины импорта (например, WP All Import) | Удобный UI, поддержка вариативных товаров | Платные, ограниченная гибкость без кода | Маркетологи, пользователи без навыков программирования |
| Встроенный импорт WooCommerce | Бесплатный, простой | Ограничен функционалом, плохо работает с вариативными товарами | Малые магазины, одноразовый импорт |