Как создать автоматический импорт продуктов из CSV в WooCommerce

Импорт товаров в WooCommerce с помощью CSV-файлов — востребованная задача для владельцев интернет-магазинов. Особенно актуально автоматизировать этот процесс, чтобы регулярно обновлять ассортимент без ручного труда. В этой статье мы рассмотрим, как создать автоматический импорт продуктов из CSV в WooCommerce, используя PHP-код и стандартные возможности WordPress. Это позволит интегрировать импорт в Cron-задачи или запускать через админ-панель.

Почему автоматизация импорта CSV в WooCommerce важна

Ручной импорт CSV через стандартный интерфейс WooCommerce становится неудобным при большом количестве товаров, регулярных обновлениях или если данные поставляются из внешних систем. Автоматизация позволяет:

  • Экономить время на загрузку и обновление продуктов.
  • Минимизировать ошибки человека при вводе данных.
  • Интегрировать импорт с внешними системами через API или FTP, где CSV регулярно обновляется.
  • Настроить расписание обновлений с помощью WP Cron или системных CRON-задач.

Для решения этой задачи можно использовать плагины, например, WPGPT для генерации описаний и мета-данных, но в основе — собственный PHP-скрипт для импорта.

Подготовка CSV файла для импорта

CSV должен содержать колонки с ключевой информацией о товаре:

  • sku — уникальный артикул товара.
  • name — название продукта.
  • description — полное описание.
  • short_description — краткое описание.
  • price — цена.
  • stock — количество на складе.
  • categories — категории через запятую.
  • images — URL изображений через запятую.

Важно, чтобы CSV был сохранён в кодировке UTF-8 и имел корректные разделители.

Пример функции импорта CSV в WooCommerce на PHP

Ниже пример базовой функции, которая считывает CSV, ищет товар по SKU и обновляет или создаёт новый товар в WooCommerce.

function wpdesk_import_products_from_csv($csv_path) {
    if (!file_exists($csv_path)) {
        return new WP_Error('file_not_found', 'CSV файл не найден');
    }

    $handle = fopen($csv_path, 'r');
    if (!$handle) {
        return new WP_Error('file_open_error', 'Не удалось открыть CSV файл');
    }

    $header = fgetcsv($handle, 0, ','); // Считываем заголовок
    $row_count = 0;

    while (($row = fgetcsv($handle, 0, ',')) !== false) {
        $data = array_combine($header, $row);
        if (!$data || empty($data['sku'])) {
            continue;
        }

        $product_id = wc_get_product_id_by_sku($data['sku']);

        if ($product_id) {
            $product = wc_get_product($product_id);
        } else {
            $product = new WC_Product_Simple();
        }

        $product->set_sku($data['sku']);
        $product->set_name($data['name']);
        $product->set_description($data['description']);
        $product->set_short_description($data['short_description']);
        $product->set_regular_price($data['price']);
        $product->set_stock_quantity(intval($data['stock']));
        $product->set_stock_status(intval($data['stock']) > 0 ? 'instock' : 'outofstock');

        // Установка категорий
        if (!empty($data['categories'])) {
            $cats = array_map('trim', explode(',', $data['categories']));
            $cat_ids = [];
            foreach ($cats as $cat_name) {
                $term = term_exists($cat_name, 'product_cat');
                if ($term === 0 || $term === null) {
                    $term = wp_insert_term($cat_name, 'product_cat');
                }
                if (!is_wp_error($term)) {
                    $cat_ids[] = is_array($term) ? $term['term_id'] : $term;
                }
            }
            $product->set_category_ids($cat_ids);
        }

        // Установка изображений
        if (!empty($data['images'])) {
            $image_urls = array_map('trim', explode(',', $data['images']));
            $attachment_ids = [];
            foreach ($image_urls as $url) {
                $attachment_id = wpdesk_media_sideload_image($url, $product->get_id());
                if ($attachment_id) {
                    $attachment_ids[] = $attachment_id;
                }
            }
            if (!empty($attachment_ids)) {
                $product->set_image_id($attachment_ids[0]);
                if (count($attachment_ids) > 1) {
                    $product->set_gallery_image_ids(array_slice($attachment_ids, 1));
                }
            }
        }

        $product->save();
        $row_count++;
    }

    fclose($handle);
    return $row_count;
}

function wpdesk_media_sideload_image($file, $post_id) {
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');

    $tmp = download_url($file);
    if (is_wp_error($tmp)) {
        return false;
    }

    $file_array = [];
    preg_match('/\/([^\/\?]+)\??/', $file, $matches);
    $file_array['name'] = $matches[1];
    $file_array['tmp_name'] = $tmp;

    $id = media_handle_sideload($file_array, $post_id);

    if (is_wp_error($id)) {
        @unlink($tmp);
        return false;
    }

    return $id;
}

Объяснение кода импорта

Функция wpdesk_import_products_from_csv последовательно читает строки CSV, сопоставляет колонки с данными и пытается найти товар по SKU.

Если товар найден, обновляет его свойства, иначе создаёт новый. Для категорий реализована проверка существования, и если категории нет, она создаётся автоматически.

Функция wpdesk_media_sideload_image скачивает изображения по URL и прикрепляет их к товару, что удобно при импорте с внешних сайтов или CDN.

Запуск импорта по расписанию с WP Cron

Чтобы импорт запускался автоматически, можно добавить Cron-задачу:

add_action('wpdesk_cron_import_products', 'wpdesk_run_import_products_cron');

function wpdesk_run_import_products_cron() {
    $csv_path = WP_CONTENT_DIR . '/uploads/products.csv';
    $result = wpdesk_import_products_from_csv($csv_path);
    if (is_wp_error($result)) {
        error_log('Import error: ' . $result->get_error_message());
    } else {
        error_log('Imported products count: ' . $result);
    }
}

if (!wp_next_scheduled('wpdesk_cron_import_products')) {
    wp_schedule_event(time(), 'hourly', 'wpdesk_cron_import_products');
}

Этот код добавляет задачу, которая будет раз в час запускать импорт из файла products.csv в папке загрузок WordPress.

Рекомендации и лучшие практики

  • Для больших файлов разбивайте импорт на части, чтобы избежать таймаутов.
  • Используйте транзакции и логи, чтобы отслеживать ошибки и прогресс.
  • Перед импортом делайте резервное копирование базы данных.
  • Для сложных задач рассмотрите готовые плагины с расширенными возможностями, например, WP All Import.

Если нужно автоматизировать приём CSV с FTP или по API, можно расширить эту функцию, добавив загрузку файла перед импортом.

Вывод

Автоматический импорт продуктов из CSV в WooCommerce — задача, которую можно решить собственным кодом с учётом особенностей магазина. В статье мы рассмотрели базовый пример, который легко адаптировать под свои нужды и интегрировать с другими системами.

Для удобства генерации описаний и метаданных товаров можно использовать плагин WPGPT, который сэкономит время на создание контента.

Как создать вложенное меню в WordPress с поддержкой AJAX
21.03.2026
Как добавить собственные настройки в админ-панель WordPress
09.11.2025
Автоподстановка данных в формах WordPress: практическое руководство с примерами
11.04.2026
Как создать собственный шорткод в WordPress
01.11.2025
WooCommerce: устранение ошибки «Невозможно создать вариант товара» при добавлении вариаций
21.05.2026

Плагин службы технической поддержки для WordPress. Создание, просмотр и ответ на тикеты. Уведомление пользователей и другие функции.