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

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

Почему стоит использовать программный импорт CSV в WooCommerce

Плагины для импорта CSV удобны, но не всегда подходят для автоматизации или интеграции с внешними системами. Например, если вы получаете обновления товаров по FTP или хотите запускать импорт по крону — программный код даёт гибкость:

  • Автоматический запуск импорта по расписанию
  • Обработка специальных полей и кастомных метаданных
  • Логирование и уведомления о результатах импорта
  • Избежание конфликтов с плагинами и настройками

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

Структура CSV и подготовка к импорту

Для примера возьмём CSV с такими колонками: sku, name, price, description, stock. SKU — уникальный идентификатор, на основе которого будем обновлять или создавать товар.

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

sku,name,price,description,stock
ABC123,Товар 1,1500,Описание товара 1,10

Файл нужно разместить на сервере, например, в папке wp-content/uploads/import/products.csv.

Функция импорта CSV в WooCommerce — подробный разбор

Создадим функцию wpset_import_products_from_csv, которая:

  • Читает CSV построчно
  • Проверяет, есть ли товар с таким SKU
  • Обновляет или создаёт товар типа product
  • Обновляет цену, описание, количество
function wpset_import_products_from_csv($filepath) {
    if (!file_exists($filepath)) {
        error_log('Wpset: CSV файл для импорта не найден: ' . $filepath);
        return false;
    }
    
    $handle = fopen($filepath, 'r');
    if (!$handle) {
        error_log('Wpset: Не удалось открыть CSV файл: ' . $filepath);
        return false;
    }
    
    $header = fgetcsv($handle);
    if (!$header) {
        error_log('Wpset: CSV файл пуст или неверный формат');
        fclose($handle);
        return false;
    }

    while (($row = fgetcsv($handle)) !== false) {
        $data = array_combine($header, $row);
        if (!$data || empty($data['sku'])) {
            continue; // Пропускаем некорректные строки
        }

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

        if ($product_id) {
            // Обновляем существующий товар
            $product = wc_get_product($product_id);
            $product->set_name($data['name']);
            $product->set_price($data['price']);
            $product->set_regular_price($data['price']);
            $product->set_description($data['description']);
            $product->set_stock_quantity((int)$data['stock']);
            $product->set_stock_status((int)$data['stock'] > 0 ? 'instock' : 'outofstock');
            $product->save();
        } else {
            // Создаём новый товар
            $new_product = new WC_Product_Simple();
            $new_product->set_sku($data['sku']);
            $new_product->set_name($data['name']);
            $new_product->set_price($data['price']);
            $new_product->set_regular_price($data['price']);
            $new_product->set_description($data['description']);
            $new_product->set_stock_quantity((int)$data['stock']);
            $new_product->set_stock_status((int)$data['stock'] > 0 ? 'instock' : 'outofstock');
            $new_product->save();
        }
    }

    fclose($handle);
    return true;
}

function wpset_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 ? (int)$product_id : 0;
}

Автоматизация запуска импорта по расписанию (WP-Cron)

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

// Регистрируем событие при активации плагина или темы
register_activation_hook(__FILE__, 'wpset_activation_cron');
function wpset_activation_cron() {
    if (!wp_next_scheduled('wpset_daily_import_event')) {
        wp_schedule_event(time(), 'daily', 'wpset_daily_import_event');
    }
}

// Удаляем расписание при деактивации
register_deactivation_hook(__FILE__, 'wpset_deactivation_cron');
function wpset_deactivation_cron() {
    wp_clear_scheduled_hook('wpset_daily_import_event');
}

// Обработчик события
add_action('wpset_daily_import_event', function() {
    $filepath = WP_CONTENT_DIR . '/uploads/import/products.csv';
    wpset_import_products_from_csv($filepath);
});

Теперь импорт будет запускаться раз в сутки автоматически. Можно менять период и время.

Полезные советы и расширения для импорта CSV в WooCommerce

1. Валидация данных

Перед импортом полезно валидировать данные — проверять формат цены, наличие обязательных полей, корректность SKU. Это можно добавить в функцию импорта, например, с помощью регулярных выражений или фильтров.

2. Логирование результатов

Для отладки и контроля добавьте запись ошибок и успешных обновлений в отдельный лог-файл или таблицу базы данных. Это помогает быстро выявлять проблемы с импортом.

3. Расширение функционала

Можно добавить поддержку вариаций, категорий, изображений. Для загрузки изображений через URL используйте функции media_sideload_image() и связывайте вложения с продуктами.

Пример импорта изображения по URL к товару

function wpset_set_product_image_from_url($product_id, $image_url) {
    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($image_url);
    if (is_wp_error($tmp)) {
        return false;
    }

    $file = array(
        'name' => basename($image_url),
        'tmp_name' => $tmp
    );

    $attachment_id = media_handle_sideload($file, $product_id);

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

    set_post_thumbnail($product_id, $attachment_id);
    return true;
}

Вызовите эту функцию после создания или обновления товара, чтобы добавить изображение.

Использование плагина Clearfy Pro для оптимизации импорта

Плагин Clearfy Pro поможет оптимизировать работу WooCommerce и WordPress при больших объёмах данных, отключая лишние скрипты и функции, что ускоряет импорт и снижает нагрузку на сервер.

Заключение

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

Как защитить WordPress от bruteforce атак с помощью кода
21.02.2026
Как создать динамические блоки с помощью шорткодов в WordPress
27.12.2025
WooCommerce: автоматическое отключение неактивных вариаций товаров
05.05.2026
Как создать собственную таблицу в WordPress без плагинов
03.12.2025
Как установить и настроить Redis кэш в WordPress
23.11.2025