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

Для владельцев интернет-магазинов на WooCommerce частая задача — автоматическое обновление каталога товаров из CSV-файлов, которые могут предоставляться поставщиками или формироваться вручную. Ручной импорт через стандартный интерфейс WordPress становится неудобным при большом объёме данных или необходимости регулярного обновления.

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

Автоматизация импорта позволяет:

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

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

Обзор популярных плагинов для импорта CSV в WooCommerce

WP All Import

Один из самых мощных и гибких плагинов. Позволяет создавать сложные схемы импорта, поддерживает крон-задания и интеграцию с WooCommerce. Платный, но с бесплатной версией для базовых задач.

Product CSV Import Suite

Официальное расширение WooCommerce для импорта и экспорта товаров. Работает с вариативными товарами, атрибутами и метаданными. Удобен для стандартных сценариев.

Если же нужно полностью автоматизировать процесс и интегрировать импорт в логику сайта, лучше писать собственный скрипт.

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

Для успешного импорта важно правильно подготовить файл:

  • Обязательные поля: SKU, название товара, цена.
  • Дополнительные поля: описание, категории, атрибуты, изображения.
  • Формат CSV должен быть UTF-8, разделитель — запятая или точка с запятой.
  • При наличии изображений указывайте URL, откуда их можно скачать.

Пример простой строки CSV:

sku,name,price,description,image_url,category
12345,Товар 1,1990,Описание товара,http://site.ru/images/12345.jpg,Категория1

Создание функции автоматического импорта CSV в WooCommerce

Напишем функцию wptool_import_products_from_csv, которая будет читать CSV, создавать или обновлять товары и запускаться по расписанию.

Основные шаги:

  1. Чтение CSV-файла из заданного пути.
  2. Парсинг строк и подготовка данных.
  3. Поиск товара по SKU, обновление или создание нового.
  4. Добавление категорий и изображений.
  5. Логирование результатов.
function wptool_import_products_from_csv($csv_path) {
    if (!file_exists($csv_path)) {
        error_log('CSV файл не найден: ' . $csv_path);
        return;
    }
    $handle = fopen($csv_path, 'r');
    if (!$handle) {
        error_log('Не удалось открыть CSV файл');
        return;
    }
    $header = fgetcsv($handle);
    while (($row = fgetcsv($handle)) !== false) {
        $data = array_combine($header, $row);
        if (empty($data['sku']) || empty($data['name'])) {
            continue; // пропускаем строки без SKU или имени
        }
        $product_id = wptool_get_product_id_by_sku($data['sku']);
        if ($product_id) {
            // Обновляем товар
            $product = wc_get_product($product_id);
        } else {
            // Создаём новый товар
            $product = new WC_Product_Simple();
        }
        $product->set_name($data['name']);
        $product->set_regular_price($data['price']);
        $product->set_description($data['description']);
        $product->save();
        // Обновляем SKU
        update_post_meta($product->get_id(), '_sku', $data['sku']);
        // Добавляем категорию
        if (!empty($data['category'])) {
            $cat_ids = wptool_get_term_ids_by_names(explode(',', $data['category']), 'product_cat');
            wp_set_object_terms($product->get_id(), $cat_ids, 'product_cat');
        }
        // Добавляем изображение
        if (!empty($data['image_url'])) {
            wptool_set_product_image($product->get_id(), $data['image_url']);
        }
    }
    fclose($handle);
}

function wptool_get_product_id_by_sku($sku) {
    global $wpdb;
    $product_id = $wpdb->get_var($wpdb->prepare(
        "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value=%s LIMIT 1",
        $sku
    ));
    return $product_id ? intval($product_id) : 0;
}

function wptool_get_term_ids_by_names($names, $taxonomy) {
    $ids = [];
    foreach ($names as $name) {
        $term = term_exists(trim($name), $taxonomy);
        if ($term) {
            $ids[] = is_array($term) ? $term['term_id'] : $term;
        } else {
            $new_term = wp_insert_term(trim($name), $taxonomy);
            if (!is_wp_error($new_term)) {
                $ids[] = $new_term['term_id'];
            }
        }
    }
    return $ids;
}

function wptool_set_product_image($product_id, $image_url) {
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    if (!$image_data) return;
    $filename = basename($image_url);
    if (wp_mkdir_p($upload_dir['path'])) {
        $file = $upload_dir['path'] . '/' . $filename;
    } else {
        $file = $upload_dir['basedir'] . '/' . $filename;
    }
    file_put_contents($file, $image_data);
    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment($attachment, $file, $product_id);
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata($attach_id, $file);
    wp_update_attachment_metadata($attach_id, $attach_data);
    set_post_thumbnail($product_id, $attach_id);
}

Автоматизация запуска импорта с помощью WP Cron

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

// Регистрируем событие
add_action('wptool_daily_import_event', 'wptool_run_daily_import');

function wptool_activate_cron() {
    if (!wp_next_scheduled('wptool_daily_import_event')) {
        wp_schedule_event(time(), 'daily', 'wptool_daily_import_event');
    }
}
register_activation_hook(__FILE__, 'wptool_activate_cron');

function wptool_deactivate_cron() {
    wp_clear_scheduled_hook('wptool_daily_import_event');
}
register_deactivation_hook(__FILE__, 'wptool_deactivate_cron');

function wptool_run_daily_import() {
    $csv_path = wp_upload_dir()['basedir'] . '/import/products.csv';
    wptool_import_products_from_csv($csv_path);
}

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

Рекомендации по безопасности и производительности

При работе с автоматическим импортом учтите следующие моменты:

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

Заключение

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

Если вы используете на сайте Clearfy Pro, там есть дополнительные инструменты для оптимизации и управления импортом, которые могут помочь улучшить производительность.

Как автоматизировать создание копий публикаций в WordPress с помощью кода
24.12.2025
Как установить ограничения на регистрацию пользователей в WordPress
21.01.2026
Как отладить проблему нерабочих AJAX-запросов в WooCommerce
05.07.2026
Как создать автоматические уведомления в WordPress с помощью хуков и AJAX
10.03.2026
Как автоматизировать удаление неиспользуемых медиафайлов в WordPress
28.02.2026