Импорт товаров в WooCommerce с помощью CSV-файлов — востребованная задача для владельцев интернет-магазинов. Особенно актуально автоматизировать этот процесс, чтобы регулярно обновлять ассортимент без ручного труда. В этой статье мы рассмотрим, как создать автоматический импорт продуктов из CSV в WooCommerce, используя PHP-код и стандартные возможности WordPress. Это позволит интегрировать импорт в Cron-задачи или запускать через админ-панель.
Почему автоматизация импорта CSV в WooCommerce важна
Ручной импорт CSV через стандартный интерфейс WooCommerce становится неудобным при большом количестве товаров, регулярных обновлениях или если данные поставляются из внешних систем. Автоматизация позволяет:
- Экономить время на загрузку и обновление продуктов.
- Минимизировать ошибки человека при вводе данных.
- Интегрировать импорт с внешними системами через API или FTP, где CSV регулярно обновляется.
- Настроить расписание обновлений с помощью WP Cron или системных CRON-задач.
Для решения этой задачи можно использовать плагины, например, WPGPT для генерации описаний и мета-данных, но в основе — собственный PHP-скрипт для импорта.
Подготовка CSV файла для импорта
CSV должен содержать колонки с ключевой информацией о товаре:
sku— уникальный артикул товара.name— название продукта.description— полное описание.short_description— краткое описание.price— цена.stock— количество на складе.categories— категории через запятую.images— URL изображений через запятую.
Важно, чтобы CSV был сохранён в кодировке UTF-8 и имел корректные разделители.
Пример функции импорта CSV в WooCommerce на PHP
Ниже пример базовой функции, которая считывает CSV, ищет товар по SKU и обновляет или создаёт новый товар в WooCommerce.
function wpdesk_import_products_from_csv($csv_path) {
if (!file_exists($csv_path)) {
return new WP_Error('file_not_found', 'CSV файл не найден');
}
$handle = fopen($csv_path, 'r');
if (!$handle) {
return new WP_Error('file_open_error', 'Не удалось открыть CSV файл');
}
$header = fgetcsv($handle, 0, ','); // Считываем заголовок
$row_count = 0;
while (($row = fgetcsv($handle, 0, ',')) !== false) {
$data = array_combine($header, $row);
if (!$data || empty($data['sku'])) {
continue;
}
$product_id = wc_get_product_id_by_sku($data['sku']);
if ($product_id) {
$product = wc_get_product($product_id);
} else {
$product = new WC_Product_Simple();
}
$product->set_sku($data['sku']);
$product->set_name($data['name']);
$product->set_description($data['description']);
$product->set_short_description($data['short_description']);
$product->set_regular_price($data['price']);
$product->set_stock_quantity(intval($data['stock']));
$product->set_stock_status(intval($data['stock']) > 0 ? 'instock' : 'outofstock');
// Установка категорий
if (!empty($data['categories'])) {
$cats = array_map('trim', explode(',', $data['categories']));
$cat_ids = [];
foreach ($cats as $cat_name) {
$term = term_exists($cat_name, 'product_cat');
if ($term === 0 || $term === null) {
$term = wp_insert_term($cat_name, 'product_cat');
}
if (!is_wp_error($term)) {
$cat_ids[] = is_array($term) ? $term['term_id'] : $term;
}
}
$product->set_category_ids($cat_ids);
}
// Установка изображений
if (!empty($data['images'])) {
$image_urls = array_map('trim', explode(',', $data['images']));
$attachment_ids = [];
foreach ($image_urls as $url) {
$attachment_id = wpdesk_media_sideload_image($url, $product->get_id());
if ($attachment_id) {
$attachment_ids[] = $attachment_id;
}
}
if (!empty($attachment_ids)) {
$product->set_image_id($attachment_ids[0]);
if (count($attachment_ids) > 1) {
$product->set_gallery_image_ids(array_slice($attachment_ids, 1));
}
}
}
$product->save();
$row_count++;
}
fclose($handle);
return $row_count;
}
function wpdesk_media_sideload_image($file, $post_id) {
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($file);
if (is_wp_error($tmp)) {
return false;
}
$file_array = [];
preg_match('/\/([^\/\?]+)\??/', $file, $matches);
$file_array['name'] = $matches[1];
$file_array['tmp_name'] = $tmp;
$id = media_handle_sideload($file_array, $post_id);
if (is_wp_error($id)) {
@unlink($tmp);
return false;
}
return $id;
}Объяснение кода импорта
Функция wpdesk_import_products_from_csv последовательно читает строки CSV, сопоставляет колонки с данными и пытается найти товар по SKU.
Если товар найден, обновляет его свойства, иначе создаёт новый. Для категорий реализована проверка существования, и если категории нет, она создаётся автоматически.
Функция wpdesk_media_sideload_image скачивает изображения по URL и прикрепляет их к товару, что удобно при импорте с внешних сайтов или CDN.
Запуск импорта по расписанию с WP Cron
Чтобы импорт запускался автоматически, можно добавить Cron-задачу:
add_action('wpdesk_cron_import_products', 'wpdesk_run_import_products_cron');
function wpdesk_run_import_products_cron() {
$csv_path = WP_CONTENT_DIR . '/uploads/products.csv';
$result = wpdesk_import_products_from_csv($csv_path);
if (is_wp_error($result)) {
error_log('Import error: ' . $result->get_error_message());
} else {
error_log('Imported products count: ' . $result);
}
}
if (!wp_next_scheduled('wpdesk_cron_import_products')) {
wp_schedule_event(time(), 'hourly', 'wpdesk_cron_import_products');
}Этот код добавляет задачу, которая будет раз в час запускать импорт из файла products.csv в папке загрузок WordPress.
Рекомендации и лучшие практики
- Для больших файлов разбивайте импорт на части, чтобы избежать таймаутов.
- Используйте транзакции и логи, чтобы отслеживать ошибки и прогресс.
- Перед импортом делайте резервное копирование базы данных.
- Для сложных задач рассмотрите готовые плагины с расширенными возможностями, например, WP All Import.
Если нужно автоматизировать приём CSV с FTP или по API, можно расширить эту функцию, добавив загрузку файла перед импортом.
Вывод
Автоматический импорт продуктов из CSV в WooCommerce — задача, которую можно решить собственным кодом с учётом особенностей магазина. В статье мы рассмотрели базовый пример, который легко адаптировать под свои нужды и интегрировать с другими системами.
Для удобства генерации описаний и метаданных товаров можно использовать плагин WPGPT, который сэкономит время на создание контента.