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