Автоматический импорт продуктов в WooCommerce через CSV: пошаговое руководство

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

Почему нужен автоматический импорт товаров в WooCommerce

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

  • Обновлять цены, наличие и описания товаров без лишних действий.
  • Сократить человеческий фактор и ошибки при вводе данных.
  • Интегрировать сайт с внешними системами учета и поставщиками.

Реализация автоматического импорта через собственный код дает полный контроль над процессом и гибкость настройки под любые требования.

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

Для корректной работы скрипта CSV должен содержать ключевые колонки, которые соответствуют параметрам продукта в WooCommerce. Обычно это:

  • SKU — уникальный артикул товара (обязательный для идентификации).
  • Название — название продукта.
  • Описание и Краткое описание.
  • Цена и Цена по акции.
  • Категории — через запятую или с разделителем.
  • Изображения — ссылки на картинки или имена файлов в папке загрузок.
  • Наличие — статус наличия товара.

Важно, чтобы CSV был в кодировке UTF-8 и корректно обрабатывался PHP-функциями.

Создание функции для импорта CSV в WooCommerce

Ниже пример функции wpmark_import_woocommerce_products_from_csv, которая читает CSV и создает/обновляет товары.

function wpmark_import_woocommerce_products_from_csv($csv_file_path) {
    if (!file_exists($csv_file_path) || !is_readable($csv_file_path)) {
        return new WP_Error('file_error', 'CSV файл не найден или недоступен');
    }

    $header = null;
    $data = [];

    if (($handle = fopen($csv_file_path, 'r')) !== false) {
        while (($row = fgetcsv($handle, 1000, ',')) !== false) {
            if (!$header) {
                $header = $row;
            } else {
                $data[] = array_combine($header, $row);
            }
        }
        fclose($handle);
    }

    foreach ($data as $product_data) {
        $sku = sanitize_text_field($product_data['SKU']);
        if (empty($sku)) continue;

        // Проверяем, есть ли товар с таким SKU
        $existing_product_id = wc_get_product_id_by_sku($sku);

        if ($existing_product_id) {
            $product = wc_get_product($existing_product_id);
        } else {
            $product = new WC_Product_Simple();
            $product->set_sku($sku);
        }

        $product->set_name(sanitize_text_field($product_data['Название']));
        $product->set_description(sanitize_textarea_field($product_data['Описание']));
        $product->set_short_description(sanitize_textarea_field($product_data['Краткое описание']));
        $product->set_regular_price(floatval($product_data['Цена']));

        if (!empty($product_data['Цена по акции'])) {
            $product->set_sale_price(floatval($product_data['Цена по акции']));
        } else {
            $product->set_sale_price('');
        }

        // Категории
        if (!empty($product_data['Категории'])) {
            $categories = array_map('trim', explode(',', $product_data['Категории']));
            $term_ids = [];
            foreach ($categories as $cat_name) {
                $term = get_term_by('name', $cat_name, 'product_cat');
                if (!$term) {
                    $term = wp_insert_term($cat_name, 'product_cat');
                }
                if (!is_wp_error($term)) {
                    $term_ids[] = is_array($term) ? $term['term_id'] : $term->term_id;
                }
            }
            $product->set_category_ids($term_ids);
        }

        // Наличие
        $stock_status = strtolower(trim($product_data['Наличие']));
        $product->set_stock_status($stock_status === 'в наличии' ? 'instock' : 'outofstock');

        // Сохраняем продукт, чтобы получить ID
        $product_id = $product->save();

        // Обработка изображений
        if (!empty($product_data['Изображения'])) {
            $images = array_map('trim', explode(',', $product_data['Изображения']));
            $attachment_ids = [];

            foreach ($images as $image_url) {
                $attachment_id = wpmark_upload_image_from_url($image_url, $product_id);
                if ($attachment_id) {
                    $attachment_ids[] = $attachment_id;
                }
            }

            if (!empty($attachment_ids)) {
                set_post_thumbnail($product_id, $attachment_ids[0]);
                if (count($attachment_ids) > 1) {
                    update_post_meta($product_id, '_product_image_gallery', implode(',', array_slice($attachment_ids, 1)));
                }
            }
        }
    }
}

// Вспомогательная функция для загрузки изображения по URL
function wpmark_upload_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');

    // Проверяем, что URL не пустой
    if (empty($image_url)) {
        return false;
    }

    // Скачиваем файл во временную папку
    $tmp = download_url($image_url);

    if (is_wp_error($tmp)) {
        return false;
    }

    $file_array = [];
    $file_array['name'] = basename($image_url);
    $file_array['tmp_name'] = $tmp;

    // Загружаем файл в библиотеку медиа
    $attachment_id = media_handle_sideload($file_array, $post_id);

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

    return $attachment_id;
}

Данная функция читает CSV, проверяет наличие товара по SKU, создаёт новый или обновляет существующий, задаёт параметры и загружает изображения. Важно использовать эту функцию в рамках безопасного процесса, например, через WP-CLI или AJAX с проверкой прав.

Интеграция с WP-Cron для регулярного обновления товаров

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

add_action('wpmark_daily_product_import', 'wpmark_run_daily_import');
function wpmark_run_daily_import() {
    $csv_path = WP_CONTENT_DIR . '/uploads/products_import.csv';
    wpmark_import_woocommerce_products_from_csv($csv_path);
}

if (!wp_next_scheduled('wpmark_daily_product_import')) {
    wp_schedule_event(time(), 'daily', 'wpmark_daily_product_import');
}

Теперь достаточно положить обновлённый CSV в указанную папку, и импорт будет выполняться автоматически.

Плагины для расширения возможностей импорта

Если вы хотите использовать готовые решения, обратите внимание на плагины:

  • WPRemark — может помочь с импортом и автоматизацией отзывов, что дополнит функционал магазина.
  • Clearfy Pro — оптимизирует работу сайта, что важно при больших объемах данных.

Тем не менее, собственный скрипт даёт максимальную гибкость и контроль.

Советы по безопасности и производительности

При реализации автоматического импорта важно учитывать нагрузку на сервер и защищать процесс от несанкционированного запуска:

  • Запускайте импорт через WP-CLI, если есть доступ к командной строке.
  • Используйте nonce и проверку прав в AJAX-запросах.
  • Разбивайте импорт на партии, чтобы избежать превышения лимита памяти и времени выполнения.
  • Логируйте ошибки и успешные импорты для отладки.

Так вы обеспечите стабильную и безопасную работу магазина.

Итоги

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

Как автоматизировать создание и удаление временных файлов в WordPress
23.02.2026
Как использовать WPRemark для автоматизации отзывов в WordPress
13.12.2025
Как удалить и заблокировать спам комментарии в WordPress
11.01.2026
Как сделать отложенный запуск задач в WordPress без стандартного WP-Cron
29.12.2025
Как отключить ревизии постов в WordPress для удаления старых версий
02.03.2026