Автоматическое создание товаров WooCommerce через CSV импорт: подробное руководство

Диагностика задачи: зачем автоматизировать импорт товаров в 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Бесплатный, простойОграничен функционалом, плохо работает с вариативными товарамиМалые магазины, одноразовый импорт
Автоматическое создание и отправка отзывов в WordPress с помощью WP Robot
13.01.2026
Как автоматически создавать персонализированные сообщения в WordPress
06.03.2026
WooCommerce: автоматическое отключение неактивных заказов
30.06.2026
Автоматическое удаление старых изображений в WordPress
25.01.2026
Как настроить автоматический импорт контента из RSS в WordPress
13.04.2026