Автоматический импорт продуктов в 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. Это позволяет экономить время, снизить ошибки и интегрировать сайт с внешними системами. Используйте пример из статьи как основу для своей реализации и адаптируйте под особенности вашего магазина.

Как избежать проблем с производительностью при массовом импорте товаров в WooCommerce
07.05.2026
Как использовать WooCommerce хуки для автоматизации изменения стоимости товаров
31.07.2026
Как закрыть страницы внутреннего поиска WordPress от индексации
30.08.2026
Как решить проблему нерабочих шорткодов WooCommerce после обновления
21.04.2026
Как автоматически отключить неиспользуемые плагины в WordPress
25.06.2026